winfo_height()在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()
zwlyuan 回答:winfo_height()在tkinter中返回不正确的值

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,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()
本文链接:https://www.f2er.com/3112117.html

大家都在问