PyGtk:在一个单独的线程中运行gtk.main()循环

时间:2016-02-29 12:55:54

标签: multithreading python-2.7 gtk pygtk

下面的代码是在声明og gtkLoopTHread本身之后被攻击,即使我没有给出gtkMainLoop.start()函数调用。 我想在后台运行计时器并在该UI中执行一些操作,并在计时器达到“0”时销毁UI。

代码

Domain Class

预期输出:

BusinessClass

当前行为: 由于gtkLoopThread在初始化gtkLoopThread变量后立即启动,因此看不到行' gtkThread声明'后打印

1 个答案:

答案 0 :(得分:3)

有几个问题阻止您的代码正常运行。

首先,您在计划开始时错过了对gobject.threads_init()import gobject之后)的调用。此调用导致PyGTK在进入主循环时释放GIL。未能调用它将使线程无用。 (在最新的Python 3 PyGObject中,这是no longer necessary.

第二个问题,这个问题很简单,就是你错误地构造了一个单元素元组,用作args构造函数的threading.Thread参数 - 它应该是{{1} },而不是args=(maxSec,)

完成上述两项更改后,程序会显示预期的输出。

最后,as andlabs points outdocumentation confirms,不允许从运行主循环的线程以外的任何线程调用GTK代码。工作线程可以使用args=(maxSec)来调度要在GUI线程中执行的代码,而不是调用GTK函数。 (如果GUI线程处于空闲状态,则会立即发生这种情况。)换句话说,您应该将gobject.idle_add替换为gtk.main_quit()。如果or函数接受参数,请改用gobject.idle_add(gtk.main_quit)。虽然在GTK程序中创建多个工作线程是完全合法的,但是必须不要直接调用GTK。

另外,根据文档,运行主循环的线程应该与初始化GTK的线程相同。因此,在GUI线程启动之前,正确的程序不应gobject.idle_add(lambda: gtk_call_here(...)(初始化它)。以下是实现此目的的代码版本:

import gtk