我遇到以下代码部分的问题:
my_var = tk.StringVar(value="start")
my_label = tk.Label(self.root, textvariable=my_var)
def my_method(input):
my_var.set("working")
#make a method call to an external Python API; can take a few mins to finish
my_var.set("complete")
tk.Button(self.root, text="GO!", command=lambda: my_method(input))
我有一个按钮,点击后,应该执行my_method
,最初应该将my_label
中的文字更改为working
,在外部API中处理一些操作,然后更新标签到complete
。实际发生的是my_method
被调用,标签的文本没有改变,API调用需要几分钟,然后我的标签更新为complete
。我假设它快速处理两个set命令,但我只看到最终的设置值。
有没有理由发生这种情况(我做错了什么)并且有解决方案吗?如果这是预期的行为,有人可以解释为什么会这样吗?
在写这篇文章的时候,我想过可能会启动一个线程来执行初始的set调用,看看是否可行。我更喜欢更简单的解决方案。
答案 0 :(得分:3)
Tkinter需要您立即从回调中返回,以便它可以返回到它需要在Tk.mainloop中进行的处理。如果无法执行此处理,则无法更新标签的文本。 (它也不能处理正常的处理事件,如拖动窗口等)。
因此,回调应该永远不会挂在主线程上很长一段时间。如果要为它们做一些耗时的处理,应该在一个单独的线程中完成。