为什么框架的自然高度不会立即更新?

时间:2014-07-26 11:45:28

标签: python python-2.7 tkinter

我正在编写一个小部件来显示一些文本行(通过Label中的Frame),并且一旦文本高度大于包含的高度,就需要调整字体大小Frame

为了做到这一点,我在文本更新后查询.winfo_reqheight() LabelFrame,并想要减少它并重写文本 - 一个循环,直到它适合(热烈欢迎任何更好的想法)

无论如何,我编写了一个测试脚本来实现该功能,但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后显示

enter image description here

和输出

frame: 21 label 51
frame: 51 label 96
frame: 96 label 141

查看Frame的大小是如何关闭的?尽管这两个小部件同时被查询,但这种行为的原因是什么?

1 个答案:

答案 0 :(得分:1)

在事件处理程序返回之前,所做的更改不会更新。

但您可以使用update_idletasks强制更新:

self.l.configure(text=message, font=('Arial', 30))
self.l.update_idletasks()

enter image description here

<强>更新

winfo_height() documentation还提到update_idletasks

  

获取此小部件的高度(以像素为单位)。注意,如果窗口   不是由几何管理器管理,此方法返回1. 得到   真正的价值,您可能需要先致电update_idletasks 。您可以   也可以使用winfo_reqheight来获取窗口小部件的请求高度(那个   是,小部件本身基于它定义的“自然”大小   内容)。