1

我对以下代码部分有疑问:

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_labelworking,在外部 API 中处理一些操作,然后将标签更新为complete。实际发生的是my_method被调用,标签的文本不会改变,API 调用需要几分钟,然后我的标签更新为complete. 我假设它可以快速处理两个设置命令,但我只看到最终的设置值。

发生这种情况是否有原因(我做错了什么)并且有解决方案吗?如果这是预期的行为,有人可以解释为什么会这样吗?

在写这篇文章的时候,我想可能会启动一个线程来执行初始的 set 调用,看看这是否可行。不过,我更喜欢更简单的解决方案。

4

1 回答 1

3

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

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

于 2013-04-04T10:49:42.393 回答