【问题标题】:Tkinter: winfo_reqwith() returns wrong valuesTkinter:winfo_reqwith() 返回错误值
【发布时间】:2026-01-20 23:20:03
【问题描述】:

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

代码如下:

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

解决了!

【问题讨论】:

    标签: python tkinter tk


    【解决方案1】:
    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()。

    【讨论】:

    • 您最有可能被否决,因为您没有解释您的代码。
    • 如果您包含对更改内容的解释,此答案会更好,这样读者就不必逐行逐字符地比较您的代码与原始代码。
    • 此时有两个人对您投了反对票。我无法控制其他人的投票方式。你可以,通过改进你的答案。投票不是人身攻击,而是一个信号,让您知道您的答案需要改进。
    【解决方案2】:

    winfo_req_widthwinfo_req_height 方法返回小部件请求 的宽度和高度——本质上是创建窗口时的widthheight 参数[1]。根窗口的默认请求宽度和高度为 200 像素。

    设置几何图形时,不会更改请求的窗口宽度和高度,只会更改实际宽度和高度。那是因为geometry 命令是给窗口管理器一个命令,而不是改变小部件本身的配置。

    如果要winfo_reqwidthwinfo_reqheight返回300,需要配置窗口的widthheight参数(如:root.configure(width=300, height=300)

    如果要获取实际宽度,需要调用winfo_widthwinfo_height。此外,您应该每次在事件处理程序中调用这些函数,因为如果用户调整窗口大小,值将会改变:

    def check(event):
        print(root.winfo_width())
        print(root.winfo_height())
    

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

    【讨论】:

      【解决方案3】:

      我知道我迟到了两年才回答这个问题,但是这个答案肯定可以帮助仍然引用这篇文章的人。

      在 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()的解释:-

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

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

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

      【讨论】: