采摘处:http://linux-wiki.cn/wiki/zh-cn/PyGTK%E7%BC%96%E5%86%99%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%A8%8B%E5%BA%8F
虽然在PyGTK中Python有关多线程的库都可以使用,但其行为常现异常,所以一定要按照PyGTK的要求编写多线程应用程序。
只允许主线程修改图形界面
这是较常用的一种方式,但编写时略显复杂。
首先,在程序初始化时调用(一定在gtk.main()之前运行):
gobject.threads_init()
多线程的实现方式与纯Python相同:
t=threading.Thread(target=新线程的函数)
t.start()
要修改界面的代码则使用gobject.idle_add加到GTK的主循环中。
注意如果新线程函数返回True,则该函数仍在GTK的主循环中,如果返回False,则退出主循环。
下面的例子是PyGTK.org上给出的:
import threading import time import gobject import gtk gobject.threads_init() class MyThread(threading.Thread): def __init__(self, label): super(MyThread, self).__init__() self.label = label self.quit = False def update_label(self, counter): self.label.set_text("Counter: %i" % counter) return False def run(self): counter = 0 while not self.quit: counter += 1 gobject.idle_add(self.update_label, counter) time.sleep(0.1) w = gtk.Window() l = gtk.Label() w.add(l) w.show_all() w.connect("destroy", lambda _: gtk.main_quit()) t = MyThread(l) t.start() gtk.main() t.quit = True
gobject.idle_add(新线程函数, 参数)
允许所有线程修改图形界面
注意:有人报告说这一方法导致程序在Windows中无法运行,但产生这一问题的原因应是他们忘了写 gtk.threads_enter(),所以请按照下面的说明写程序。
这种方法要简单很多。与前面类似,在程序初始化时调用:
gtk.gdk.threads_init()
不过要把gtk.main()用下面两个函数括起来:
gtk.threads_enter() gtk.main() gtk.threads_leave()
其它线程也是如此,在修改界面内容的代码前后加上gtk.threads_enter()、gtk.threads_leave()