在Tkinter画布中调整大小的响应小部件

时间:2018-06-20 11:38:14

标签: python tkinter tkinter-canvas

当我将tkinter窗口的行和列配置为weight = 1,然后在其上覆盖所有行和列的画布上时,画布将响应大小:

win=Tk()
win.geometry("1200x675")
rows=0
while rows<200:
    win.rowconfigure(rows,weight=1)
    win.columnconfigure(rows,weight=1)
    rows+=1

canvas=Canvas(win,bg='white',width=1200,height=675)
canvas.grid(sticky='nesw',rowspan=200,columnspan=200)

但是在画布中特定坐标处放置的小部件仍保持相同的大小和位置,例如一个按钮:

but=Button(text="Calculate")
canvas.create_window(100,100,window=but)

因此,任何人都可以提供有关如何使小部件也具有尺寸响应能力的帮助。

1 个答案:

答案 0 :(得分:1)

您不需要制作那么多网格单元。一格 weight = 1将随着尺寸的变化扩展画布。

没有通用的方法来缩放包含的小部件,您将 必须自己写。

使用<Configure>更改挂钩窗口大小,然后循环浏览 画布形式canvas.find_withtag('all')上的小部件。请参见下面的示例:

from tkinter import *

win = Tk()
win.geometry("300x200+800+50")

win.rowconfigure(0, weight=1)
win.columnconfigure(0, weight=1)

canvas=Canvas(win, bg='white')
canvas.grid(sticky='nesw')

def size(event):
    width, heigth = canvas.winfo_width(), canvas.winfo_height()
    print('Canvas size:', width, 'x', heigth)
    items = canvas.find_withtag('all')  # Find all widgets on canvas
    for item in items:
        pass    # Change widget size here, one widget at a time

win.bind('<Configure>', size)   # Hook window size changes

win.mainloop()
相关问题