Tkinter:winfo_reqwith() returns 错误的值

Tkinter: winfo_reqwith() returns wrong values

我写了一个代码,它在调整大小后打印 window 的大小,但是每次函数打印宽度“200”和高度“200”时,无论 window大小是。 我该如何解决这个问题?

代码如下:

from tkinter import *

Root=Tk()
Root.title("Window")

lab = Label(Root, text = "Test")
lab.pack()
Root.geometry("300x300")

RWidth=Root.winfo_reqwidth()
RHeight=Root.winfo_reqheight()


def check(event):
    print(RWidth)
    print(RHeight)

Root.bind("<Configure>",check)


mainloop()

已解决!

from tkinter import *

Root=Tk()
Root.title("Window")

lab = Label(Root, text = "Test")
lab.pack()
Root.geometry("300x300")

RWidth=Root.winfo_width()
RHeight=Root.winfo_height()


def check(event):
    RWidth = Root.winfo_width()
    RHeight = Root.winfo_height()
    print(RWidth)
    print(RHeight)

Root.bind("<Configure>",check)


mainloop()

你必须在适当的地方写 RWidth = Root.winfo_width() RHeight = Root.winfo_height()。

winfo_req_widthwinfo_req_height 方法 return 小部件 请求 的宽度和高度 -- 本质上,widthheight 参数,当您创建 window [1] 时。根 window 的默认请求宽度和高度为 200 像素。

设置几何图形时,不会更改 window 请求的宽度和高度,只会更改实际宽度和高度。这是因为 geometry 命令是向 window 管理器发出命令,而不是更改小部件本身的配置。

如果要winfo_reqwidthwinfo_reqheight到return300,需要配置[=40=的widthheight参数](例如:root.configure(width=300, height=300)

如果要获取实际宽度,需要调用winfo_widthwinfo_height。此外,您应该每次都在事件处理程序中调用这些函数,因为如果用户调整 window:

的大小,值将会改变
def check(event):
    print(root.winfo_width())
    print(root.winfo_height())

[1] 大多数小部件允许您在创建时指定宽度和高度(例如:Label(root, width=300, height=300))。奇怪的是,您无法在创建根 window 时指定这些参数。但是,您可以在通过 configure 方法创建后更改它们(例如:root.configure(width=300, height=300))。

我知道我迟到了两年才回答这个问题,但是仍然在参考这个问题的人 post 这个答案肯定会有所帮助。

在 tkinter 中,我们有 2 种方法来更新所有挂起的空闲任务,它们是 update()update_idletasks()。下面的代码按预期工作。我使用 winfo_width() 而不是 winfo_reqwidth()。使用 winfo_reqwidth() 没有错,但我仍然更喜欢使用 winfo_width() 而不是 winfo_reqwidth()。

所以这里的想法是使用可用的两种方法之一更新空闲挂起任务 [update(), update_idletasks()]。当这些任务更新后,我们可以调用我们的 winfo_width() 和 winfo_height() 方法来获得准确的值。

from tkinter import *

Root=Tk()
Root.title("Window")

lab = Label(Root, text = "Test")
lab.pack()
Root.geometry("300x300")

Root.update_idletasks()

def check(event):
    RWidth = Root.winfo_width()
    RHeight = Root.winfo_height()
    print(RWidth)
    print(RHeight)

Root.bind("<Configure>",check)
mainloop()

update()和update_idletasks()的解释:-

更新方法处理所有挂起的空闲任务、未访问的事件、调用函数和回调。该方法适用于更新和处理所有事件或任务,如重绘小部件、几何管理、配置小部件属性等

它还确保如果应用程序有任何挂起的任务,那么它只会更新或刷新影响整个应用程序部分的值。对单个挂起的任务使用更新会很讨厌,因此 Tkinter 还提供了 update_idletasks() 方法。它只更新应用程序中处于稳定状态或由于某种原因没有更新的空闲挂起任务。它调用所有挂起的事件而不处理任何其他事件或回调。

update() 和 update_idletask() 方法对于处理任何挂起或空闲任务很有用。但是,update() 和 update_idletasks() 之间的唯一区别是 update() 处理应用程序中存在的所有事件,而 update_idletasks() 只处理那些不是 运行 或稳定。