【发布时间】:2019-09-26 14:11:45
【问题描述】:
由于 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 线程安全吗?
【问题讨论】:
-
我猜是root.after在队列中添加了一个任务,root.mainloop()从中依次执行任务
-
好吧,
after()只是 tkinter 管理在特定时间后运行的事件的方式。这与直接调用函数/命令没有什么不同,只是稍后再调用。我不相信它与它正在调用的线程任务有任何交互。我不在这样的线程中使用全局命名空间,所以我不确定。我通常将任何需要更新的内容传递给线程,然后从那里进行更改。 -
如果 "由于 tkinter 不是线程安全的!" 是
True那么 "是 root.after线程安全?”不能是True? -
@Mike-SMT 我不认为这是真的:“这与直接调用函数/命令没有什么不同,只是稍后再执行。” .这是一个显着的区别,因为调用
after只是向队列中添加了一些东西,它不会触及内部的小部件对象。 -
您阅读以下答案了吗?这可能是关于线程的最权威的答案,因为它是由 Tcl 开发人员之一编写的:stackoverflow.com/a/38767665/7432
标签: python multithreading tkinter thread-safety