我的代码的打印输出是
master.winfo_width:300,winfo_height:300
frame.winfo_width:300,winfo_height:269
为什么frame.winfo_height()
是269而不是300?
环境:Windows 10 Home 64位版本,python 3.7.4,tkinter verion 8.4
import tkinter as tk
from PIL import Image, ImageTk
class MyFrame(tk.Frame, object):
def __init__(self, master=None, width=10, height=10):
super(MyFrame, self).__init__(master)
self.bind_all('<Key>', self.keyevt)
def keyevt(self, evt):
print("self.winfo_width:%d,winfo_height:%d"%(self.winfo_width(),self.winfo_height()))
master = tk.Tk()
master.resizable(False, False)
master.geometry("300x300")
lander = ImageTk.PhotoImage(file="./csdn.png")
frame = MyFrame(master, width=300, height=300)
master.update()
canvas = tk.Canvas(frame)
canvas.pack()
frame.pack()
frame.update()
imagelander = canvas.create_image(150, 150, image=lander)
canvas.pack()
print("master.winfo_width:%d,winfo_height:%d"%(master.winfo_width(),master.winfo_height()))
print("frame.winfo_width:%d,winfo_height:%d"%(frame.winfo_width(),frame.winfo_height()))
master.mainloop()
答案 0 :(得分:1)
Frame
更改大小以适合其孩子的大小。
因为Canvas
的默认高度为267
,所以Frame
的大小自动相同。如果您设置
canvas = tk.Canvas(frame, height=300)
然后,Frame
的高度也将为300
。
您也可以关闭此设置,框架不会更改其大小
frame.propagate(False)
如果在更改窗口大小时需要调整Frame
的大小,则可能更有用
frame.pack(expand=True, fill='both')
顺便说一句:要在自己的框架中设置尺寸,您必须将尺寸发送到`super()
super().__init__(master, width=width, height=height) # , bg='red')
示例代码。
我添加了背景色以查看“画布”(绿色)和“框架”(红色)的大小。
我还删除了图像,以便每个人都可以轻松复制代码并运行它。
import tkinter as tk
class MyFrame(tk.Frame):
def __init__(self, master=None, width=10, height=10):
super().__init__(master, width=width, height=height, bg='red')
self.bind_all('<Key>', self.keyevt)
def keyevt(self, evt):
print("self.winfo_width:%d,winfo_height:%d"%(self.winfo_width(),self.winfo_height()))
def test(event=True):
print("master: {}, {}".format(master.winfo_width(), master.winfo_height()))
print("frame : {}, {}".format(frame.winfo_width(), frame.winfo_height()))
print("canvas: {}, {}".format(canvas.winfo_width(), canvas.winfo_height()))
master = tk.Tk()
master.resizable(False, False)
master.geometry("300x300")
frame = MyFrame(master, width=300, height=300)
frame.propagate(False)
frame.pack()#expand=True, fill='both')
canvas = tk.Canvas(frame, bg='green')#, height=300)
canvas.pack()
print('before update')
test()
master.update()
print('after update')
test()
print('200 ms after starting mainloop')
master.after(200, test)
#print('when window change size')
#master.bind('<Configure>', test)
master.mainloop()