PyGTK編寫多線程程序

此頁由 Linux Wiki使用者Chenxing 於 2008年10月11日 (星期六) 09:23 的最後更改。

出自Linux Wiki

提示:此文已超过 16 年(5917 天)未更新,如发现内容过时或有误,欢迎改进:)

雖然在PyGTKPython有關多線程的庫都可以使用,但其行為常現異常,所以一定要按照PyGTK的要求編寫多線程應用程序。

只允許主線程修改圖形界面

這是較常用的一種方式,但編寫時略顯複雜。

首先,在程序初始化時調用(一定在gtk.main()之前運行):

gobject.threads_init()

多線程的實現方式與純Python相同:

t=threading.Thread(target=新线程的函数)
t.start()

要修改界面的代碼則使用gobject.idle_add加到GTK的主循環中。

gobject.idle_add(新线程函数, 参数)

注意如果新線程函數返回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

允許所有線程修改圖形界面

Note.gif
注意:
有人報告說這一方法導致程序在Windows中無法運行,但產生這一問題的原因應是他們忘了寫gtk.threads_enter(),所以請按照下面的說明寫程序。

這種方法要簡單很多。與前面類似,在程序初始化時調用:

gtk.gdk.threads_init()

不過要把gtk.main()用下面兩個函數括起來:

gtk.threads_enter()
gtk.main()
gtk.threads_leave()

其它線程也是如此,在修改界面內容的代碼前後加上gtk.threads_enter()、gtk.threads_leave()

本文对您有帮助?分享给更多朋友!

反馈与讨论

发现文档不全面、有错误却没时间编辑文档?想分享自己的经验或见解?欢迎在此留言、讨论。
简体繁体转换