我的程序进行复杂的计算,持续约30分钟。我想更新Tkinter GUI中某些变量的值,理想情况下某些变量链接到某些标签,以便在更改其值时自动更新。虽然我明白我可以创建2个线程(一个用于主程序,一个用于TKinter,每隔一秒左右调用一次),我想知道是否有更优雅的方法来处理这个问题。任何建议都表示赞赏。
以下示例显示了它的外观,但示例并不起作用。
import Tkinter as tk
import time
class SampleApp(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.counter = tk.Label(self, text="")
self.counter.pack()
# start the clock "ticking"
self.mainLoop()
def mainLoop(self):
for i in range (10000):
j=i^2
self.counter.configure(text=str(j))
time.sleep(0.1)
if __name__== "__main__":
app = SampleApp()
app.mainloop()
但是,当mainLoop替换为:
时,它确实有效def mainLoop(self):
now = time.strftime("%H:%M:%S" , time.gmtime())
self.counter.configure(text=now)
# call this function again in one second
self.after(1000, self.mainLoop)
我的问题:
答案 0 :(得分:0)
回答第一个问题 -
为什么它适用于" self.after"但没有for循环
当创建该类的对象时,将调用类的__init__()
方法。现在,在您的情况下,该类将在行中创建 -
app = SampleApp()
在您的__init__()
中,您可以致电 - self.mainLoop()
。
在for
循环的情况下,所有这些都在主线程中运行。所以它不会从它已经完成的self.mainLoop()
返回,因为你没有作为一个单独的线程启动self.mainLoop()
,你在同一个线程中这样做。因此,只有在self.mainLoop()`完成并返回控件后,控件才会到达root.mainloop()
行。
如果使用after()
方法,它的行为类似于在一段时间后注册要触发的事件,并立即返回,它不会等待那么多时间,也不会等待函数回来。因此,控件立即返回,并调用root.mainloop()
来显示GUI。