由于 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()
所以不要执行
root.title('foo')
直接在worker
线程,我们用 root.after
将它排队并让主线程执行它。但不是打电话root.after
和打电话一样糟糕root.title
?是 root.after
线程安全?
最佳答案
after
是线程安全的,因为它是根据 call
实现的根据 CPython source code,这通常是线程安全的如果 CPython 和 Tcl 是用线程支持构建的(最常见的情况)。这意味着 tkinter
的占用空间很大。方法是线程安全的,但不是全部(特别是 eval
)。
如果您调用 after
(或 call
)来自其他一些 CPython 线程,它实际上会向主线程(使用 Tcl 解释器)发送线程安全消息,以实际与 Tcl API 交互并在主线程中运行命令。
关于python - tkinter 的 `after` 方法线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58118723/