https://wiki.gnome.org/Projects/PyGObject/Threading
..但是,不建议使用Gdk.threads_init(),我建议:
- 根本不调用Gdk.threads_init,Gdk.threads_enter / leave
- 使用GLib.idle_add代替Gdk.threads_add_idle(或任何其他Gdk.threads_ *函数)
- 使用GLib.idle / timeout_add将接触Gdk / Gtk的内容推入主线程
为什么?:
- 不调用Gdk.threads_init意味着将没有锁,如果您从不从另一个线程访问GDK则可以。
- 由于没有锁,因此Gdk.threads_enter不会执行任何操作。
- 在这种情况下,GLib.idle_add等于Gdk.threads_add_idle。
关于其他库:
- 一些GI模块可以在其他线程中发出某些信号/回调(例如,在GStreamer中,GstPlayBin :: about-to-finish信号);即使您根本不在代码中使用Python线程。不能直接在其中调用Gdk / Gtk代码,如果需要,也可以在其中使用idle_add。
- GLib / GStreamer的许多部分都是线程安全的,可以从其他线程中调用。
tl; dr: 仅GObject.threads_init()* , 在线程中 使用 GLib.idle_add 将所有Gtk /
Gdk代码推送到主线程 *



