由于 tkinter 不是线程安全的,我经常看到人们使用 after
方法将一些代码排队在主线程中执行。以下是一个示例:
import tkinter as tk
from threading import Thread
def change_title():
root.after(0, root.title, 'foo')
root = tk.Tk()
Thread(name='worker', target=change_title).start()
root.mainloop()
所以,我们不直接在worker
线程中执行root.title('foo')
,而是使用root.after
将其加入队列,让主线程来执行它。但是,调用root.after
和调用root.title
一样糟糕吗?root.after
是线程安全的吗?
after()
就是 tkinter 执行特定时间后管理事件的方法。这与直接调用函数/命令没有任何区别,只是稍后执行而已。我不认为它会与调用的线程任务有任何交互。我不会在线程内这样使用全局命名空间,所以我不确定。通常我会将需要更新的任何内容传递给线程,然后从那里进行更改。 - Mike - SMTafter
只是将某些内容添加到队列中,而不会触及内部小部件对象。 - Bryan Oakleyupdate()
,听起来可能会引起一些问题。 - Mike - SMT