我想用python(pyGTK)開發一個GNOME小程序(放到面板中)。我已開始遵循tutorial suggested in other SO question。使用線程的GNOME小程序掛起
我的計劃是讓applet以重複的方式在背景中執行某些操作(使其顯示更新)。所以我認爲我需要線程來做到這一點。我見過幾篇關於如何在pyGTK中使用線程的教程 - 其中大部分都遵循pyGTK FAQ。他們都表示謹慎。
我試過不同的版本,包括。
#!/usr/bin/python
import pygtk
import sys
pygtk.require('2.0')
import gtk
import gobject
gobject.threads_init()
import gnomeapplet
import time
from threading import Thread
def threadFunction(label):
gobject.idle_add(label.set_text, 'In the thread')
def factory(applet, iid):
text = gtk.Label('Start %s' % iid)
applet.add(text)
applet.show_all()
Thread(target=threadFunction, args=(text)).start()
return True
if __name__ == '__main__':
print "Starting factory"
gnomeapplet.bonobo_factory("OAFIID:Gnome_Panel_Example_Factory", gnomeapplet.Applet.__gtype__, "Simple gnome applet example", "1.0", factory)
但它不起作用。嘗試更新演示文稿時線程執行似乎掛起(gobject.idle_add
)。我想:
- 與
gtk.gdk.threads_init()
更換gobject.threads_init()
- 因爲這是一些教程使用, - 子類threading.Thread類,而不是使用圍繞與內運行任何代碼
gtk.threads_enter
和gtk.threads_leave
使用Thread(target=)
- 一個單獨的線程並更新小部件,
那麼我的錯誤是什麼?
線程是否與applet不兼容(與其他pyGTK程序相反)?
不過,這不'gobject.idle_add'應該在主線程中調用更新?至少這看起來是爲了什麼而發明的?無論如何感謝您的回答。 – 2010-01-13 07:34:45
我不認爲它會從主線程內執行它,如果你從另一個線程調用它。 idle_add的意圖是允許gobject在沒有更高優先級的事情時調用該函數。在這一點上,我正在冒險進行投機。我的建議仍然是從主線程輪詢你的工作線程,並從主線程調用idle_add。 – 2010-01-13 15:44:11
順便說一句,包括gtk標籤可能會讓你對gtk內部知道更多的人更容易看到你的問題。 – 2010-01-13 15:44:55