我正在编写一个小部件来显示一些文本行(通过Label
in a Frame
)并且一旦文本高度大于包含内容的高度,就需要调整字体大小Frame
.
为此,我正在查询.winfo_reqheight()
为了Label
和Frame
文本更新后,想法是减少它并重写文本 - 循环,直到它适合(热烈欢迎任何更好的想法)
无论如何,我编写了一个测试脚本来实现该功能,但是我得到的高度Frame
与其中之一相比是一次性的Label
(更新文本后)。
实际上:代码
import Tkinter as tk
class App():
def __init__(self):
self.root = tk.Tk()
self.root.geometry("200x200")
self.f = tk.Frame(self.root)
self.f.pack(expand=True, fill=tk.BOTH)
self.l = tk.Label(self.f)
self.l.pack(expand=True, fill=tk.BOTH)
self.root.bind("q", func=self.addline)
self.counter = 0
def addline(self, event):
mylist = list()
self.counter += 1
for _ in range(self.counter):
mylist.append("hello")
message = '\n'.join(mylist)
self.l.configure(text=message, font=('Arial', 30))
print("frame: {0} label {1}".format(self.f.winfo_reqheight(), self.l.winfo_reqheight()))
App().root.mainloop()
按三下后q
显示
和输出
frame: 21 label 51
frame: 51 label 96
frame: 96 label 141
看看大小如何Frame
是一过吗?尽管同时查询两个小部件,但出现此行为的原因是什么?
在事件处理程序返回之前,所做的更改不会更新。
但您可以使用强制更新update_idletasks http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.update_idletasks-method:
self.l.configure(text=message, font=('Arial', 30))
self.l.update_idletasks()
UPDATE
winfo_height()文档 http://effbot.org/tkinterbook/widget.htm#Tkinter.Widget.winfo_height-method还提到update_idletasks
:
获取此小部件的高度(以像素为单位)。请注意,如果窗口
不受几何管理器管理,此方法返回 1。给你得到
真正的价值,你可能需要打电话update_idletasks
first。你可以
也使用winfo_reqheight
获取小部件请求的高度(即
是,小部件本身根据它的大小定义的“自然”尺寸
内容)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)