下面的代码是在声明og gtkLoopTHread本身之后被攻击,即使我没有给出gtkMainLoop.start()函数调用。 我想在后台运行计时器并在该UI中执行一些操作,并在计时器达到“0”时销毁UI。
代码
Domain Class
预期输出:
BusinessClass
当前行为: 由于gtkLoopThread在初始化gtkLoopThread变量后立即启动,因此看不到行' gtkThread声明'后打印
答案 0 :(得分:3)
有几个问题阻止您的代码正常运行。
首先,您在计划开始时错过了对gobject.threads_init()
(import gobject
之后)的调用。此调用导致PyGTK在进入主循环时释放GIL。未能调用它将使线程无用。 (在最新的Python 3 PyGObject中,这是no longer necessary.)
第二个问题,这个问题很简单,就是你错误地构造了一个单元素元组,用作args
构造函数的threading.Thread
参数 - 它应该是{{1} },而不是args=(maxSec,)
。
完成上述两项更改后,程序会显示预期的输出。
最后,as andlabs points out和documentation 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