winfo_height()在tkinter中返回不正确的值

时间:2019-11-13 07:26:26

标签: python tkinter

我的代码的打印输出是

  

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()

1 个答案:

答案 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()