Я пытаюсь разработать апплет GNOME (помещенный в панель), используя python (pyGTK). Я начал с того, что следовал учебнику , предложенному в другом вопросе SO .
Мой план состоит в том, чтобы позволить апплету делать что-то в фоновом режиме повторяющимся образом (вызывая обновление его отображения). Поэтому я подумал, что мне понадобятся темы, чтобы сделать это. Я видел несколько руководств по использованию потоков с 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
). Я попробовал:
- замена
gobject.threads_init()
на gtk.gdk.threads_init()
- потому что это то, что используют некоторые учебники,
- Подклассирование потоков. Класс вместо использования
Thread(target=)
- используя
gtk.threads_enter
и gtk.threads_leave
вокруг любого кода, который запускается в отдельном потоке и обновляет виджеты,
В чем тогда моя ошибка?
Является ли многопоточность несовместимой с апплетами (в отличие от других программ pyGTK)?