如何在 tkinter 中找出当前小部件的大小?

Posted

技术标签:

【中文标题】如何在 tkinter 中找出当前小部件的大小?【英文标题】:How to find out the current widget size in tkinter? 【发布时间】:2011-04-26 10:15:12 【问题描述】:

我正在使用 PythonTkinter,我需要知道小部件的当前尺寸(宽度、高度)。

我试过somewidget["width"],但它只返回一个固定值,并且不会在小部件大小发生变化时更新(例如,当窗口调整大小时)。

【问题讨论】:

您确定您的小部件正在调整大小吗? 【参考方案1】:

使用somewidget.winfo_width()somewidget.winfo_height() 获取实际的小部件大小,somewidget['width'] 属性只是给几何管理器的提示。

【讨论】:

我认为您的意思是“几何管理器”,而不是“窗口管理器”。谢谢! 根据this answer 实际 表示在mainloop() 调用之后。这反过来意味着,如果想要调试小部件的大小,则必须将print 语句放在事件循环(回调)中的某处,或者将信息放在一些小部件(如标签)上并读取它。如果您考虑一下,这是合乎逻辑的,但我想旧的程序习惯无论如何都会起作用。 别忘了在下面查看 Apostolos 的答案 :)【参考方案2】:

somewidget.winfo_width()somewidget.winfo_height() 给出 1。在获取这些值之前,您需要更新 Tk(问题 tk.update())。

【讨论】:

最重要的是,我浪费了很多时间调试这个 我只能再说一遍经典的调试东西,真的这应该是公认的答案。 听起来是个好主意,我得到了“1”。但我们实际上做了什么?什么是更新 Tk(发出 tk.update()) @John, tk.update() 更新了到目前为止对 Tkinter 所做的更改。初始化Tkinter后设置新的宽高(用tk = Tk()root = Tk()等)就是这样的变化。 @Apostolos,是的,谢谢,我想我正在慢慢开始明白它......我发现调用 widget.update() 足以获得真正的宽度而不是令人费解的1'。我猜 tk.update() 会刷新所有“过时”的小部件(无论这意味着什么......,我在某处读过它......?),而 widget.update() 也同样如此小部件。我担心 tk 本身会有一些令人费解的变化,这很难理解。【参考方案3】:

您可以使用函数somewidget.winfo_reqheight() 获取高度和somewidget.winfo_reqwidth() 获取宽度,但首先不要忘记调用您想知道尺寸的小部件的更新函数somewidget.update()。如果不调用更新函数会得到默认值1

【讨论】:

补充一点,如果你的 tkinter.Toplevel 父元素(通常从 tkinter.Tk() 生成)因为它是 iconify()-ed 或 withdraw()-n 而不可见,你也将只得到1,直到你deiconify()update()顶部窗口。 在顶层窗口上,没有 .update(),我只使用 .winfo_reqwidth 或 .winfo_reqheight() 我得到了小部件的大小。我使用 Python 3.9

以上是关于如何在 tkinter 中找出当前小部件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改标签小部件中的文本大小,python tkinter [重复]

如何在字体更改时停止 Tkinter Text 小部件调整大小?

如何在tkinter中设置小部件的大小?

如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?

使用tkinter.pack()始终使小部件居中

调整窗口大小时调整 Tkinter Listbox 小部件的大小