2010-01-12 39 views
2

我想用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_entergtk.threads_leave使用Thread(target=)
  • 一個單獨的線程並更新小部件,

那麼我的錯誤是什麼?

線程是否與applet不兼容(與其他pyGTK程序相反)?

回答

2

根據對gtk列表的幾點評論,你不應該試圖從線程更新你的用戶界面。最好從主應用程序輪詢子線程。參考見herehere。更多可以通過搜索檔案找到。我不知道這個的任何官方文件。

+0

不過,這不'gobject.idle_add'應該在主線程中調用更新?至少這看起來是爲了什麼而發明的?無論如何感謝您的回答。 – 2010-01-13 07:34:45

+0

我不認爲它會從主線程內執行它,如果你從另一個線程調用它。 idle_add的意圖是允許gobject在沒有更高優先級的事情時調用該函數。在這一點上,我正在冒險進行投機。我的建議仍然是從主線程輪詢你的工作線程,並從主線程調用idle_add。 – 2010-01-13 15:44:11

+0

順便說一句,包括gtk標籤可能會讓你對gtk內部知道更多的人更容易看到你的問題。 – 2010-01-13 15:44:55