我正在编写一个小部件来显示一些文本行(通过Label
中的Frame
),并且一旦文本高度大于包含的高度,就需要调整字体大小Frame
。
为了做到这一点,我在文本更新后查询.winfo_reqheight()
Label
和Frame
,并想要减少它并重写文本 - 一个循环,直到它适合(热烈欢迎任何更好的想法)
无论如何,我编写了一个测试脚本来实现该功能,但Frame
的高度与Label
相比是一次性的(在更新文本之后)。< / p>
实际上:代码
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
的大小是如何关闭的?尽管这两个小部件同时被查询,但这种行为的原因是什么?
答案 0 :(得分:1)
在事件处理程序返回之前,所做的更改不会更新。
但您可以使用update_idletasks
强制更新:
self.l.configure(text=message, font=('Arial', 30))
self.l.update_idletasks()
<强>更新强>
winfo_height()
documentation还提到update_idletasks
:
获取此小部件的高度(以像素为单位)。注意,如果窗口 不是由几何管理器管理,此方法返回1. 得到 真正的价值,您可能需要先致电
update_idletasks
。您可以 也可以使用winfo_reqheight
来获取窗口小部件的请求高度(那个 是,小部件本身基于它定义的“自然”大小 内容)。