方法执行命令的延迟

时间:2013-04-04 10:40:48

标签: python tkinter

我遇到以下代码部分的问题:

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调用,看看是否可行。我更喜欢更简单的解决方案。

1 个答案:

答案 0 :(得分:3)

Tkinter需要您立即从回调中返回,以便它可以返回到它需要在Tk.mainloop中进行的处理。如果无法执行此处理,则无法更新标签的文本。 (它也不能处理正常的处理事件,如拖动窗口等)。

因此,回调应该永远不会挂在主线程上很长一段时间。如果要为它们做一些耗时的处理,应该在一个单独的线程中完成。