python - tkinter 的 `after` 方法线程安全吗?

标签 python multithreading tkinter thread-safety

由于 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/

相关文章:

python - 将 DataFrame 的列设置为 FacetGrid 图形的行

python - ThreadPoolExecutor 中的 worker 并不是真正的守护进程

java - 如何防止同一类实例中的不同线程同时执行方法

multithreading - 使用 `threadDelay` 时系统调用量过多

python - Tkinter:调用多线程实例

python - 使用 Ctrl-C 退出 tkinter 应用程序并捕获 SIGINT

python - 如何从另一个模块动态生成一组 TestCase 子类?

python - 缩短字典中键的长度

python - Python 类的最大方法数是多少?

python - Mac 上 virtualenv 中的 Tkinter?