2

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 プログラムとは対照的に) アプレットと互換性がありませんか?

4

2 に答える 2

2

gtk リストに関するいくつかのコメントによると、スレッドからユーザー インターフェイスを更新しようとするべきではありません。メイン アプリケーションから子スレッドをポーリングすることをお勧めします。参照については、こちらこちらを参照してください。アーカイブを検索すると、さらに多くの情報を見つけることができます。私はこれに関する公式文書を知りません。

于 2010-01-13T02:56:23.550 に答える