Python(pyGTK)を使用してGNOMEアプレット(パネルに配置)を開発しようとしています。他の SO question で提案されているチュートリアルに従うことから始めました。
私の計画は、アプレットがバックグラウンドで何かを繰り返し実行できるようにすることです (表示が更新されます)。だから私はそれを行うためにスレッドが必要になると思った。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()
- 使用する代わりに threading.Thread クラスをサブクラス化する
Thread(target=)
- 別のスレッド内で実行され、ウィジェットを更新するコードの使用
gtk.threads_enter
および周辺gtk.threads_leave
私の間違いは何ですか?
スレッド化は (他の pyGTK プログラムとは対照的に) アプレットと互換性がありませんか?