我想在开始处理后立即显示“正在加载”。因此,我使用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()
答案 0 :(得分:3)
所有屏幕更新都会响应事件而发生。如果事件循环未运行,则无法处理这些事件。通过使用after,您可以在调用函数之前为事件循环提供处理“重绘”事件的机会。请注意,tkinter是单线程的,因此在其他代码运行时不能处理任何事件。
Tkinter有一个名为the -D
flag的通用窗口小部件方法,它允许事件循环处理所有“空闲”任务,包括刷新显示。