UI的变化何时反映在Tkinter中?

时间:2015-05-18 15:51:21

标签: python tkinter

我想在开始处理后立即显示“正在加载”。因此,我使用tkinter.StringVar方法更改了与tkinter.Label关联的变量(set())。但是,在完成下一个处理后会反映出这种变化。此外,如果我正常调用loading(),则在所有进程完成后显示UI。要提前显示窗口,我必须使用self.after(time, loading)。为什么?这是代码段。

import glob
import os
import tkinter
import time

class Application(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self)
        self.filepaths = []
        self.var = tkinter.StringVar()
        self.var.set("No Info")
        self.info = tkinter.Label(self, textvariable = self.var)
        self.info.pack()
        self.after(1000, self.loading)


    def loading(self):
        self.var.set("Now Loading")
        self.dirrecur(".")
        print(self.filepaths)
        self.var.set("No Info")

    def dirrecur(self, dirname):
        contents = glob.glob(dirname + "/*")
        for content in contents:
            if os.path.isdir(content):
                self.dirrecur(content)
            else:
                print(content)
                self.filepaths.append(content)

Application().mainloop()

1 个答案:

答案 0 :(得分:3)

所有屏幕更新都会响应事件而发生。如果事件循环未运行,则无法处理这些事件。通过使用after,您可以在调用函数之前为事件循环提供处理“重绘”事件的机会。请注意,tkinter是单线程的,因此在其他代码运行时不能处理任何事件。

Tkinter有一个名为the -D flag的通用窗口小部件方法,它允许事件循环处理所有“空闲”任务,包括刷新显示。