0

私は GTK を初めて使用し、単純に聞こえる問題に出くわしましたが、それを処理する方法が見つかりません。基本的に、呼び出しgtk.main()を行うと、シングル スレッド プロセスが停止します。gtk.main()それがブロックしていることは知っていますが、これまで一gtk.main()度も呼び出したことがありません。終了するループがないため、メイン ループを終了しても何の効果もありません。

それでも、gtk.main_level()0 を返します。また、gtk.main()python コマンド ラインから実行しようとすると、ハングします。私が欠けている基本的なものがあるので、誰かがそれを指摘できますか? 感謝。

編集:私が必要とする Gtk メソッドはgobject.add_timeout、次のようになります。

gobject.timeout_add(2000, callback)
gtk.main() # This blocks the thread.
4

2 に答える 2

8

アプリケーションをブロックしているように見えますが、実行しているのはイベントの処理です。イベントの1つは、ループを終了する必要があります。ウィキペディアでイベントループの背後にある考え方を確認できます。

グラフィカルインターフェイスをプログラムしたくない場合は、Gtkは必要ありません。必要なのは、Glibだけです。ここにメインループがどのように機能するかを示す例があります(概念はGtkとGlibで似ています):

from gi.repository import GLib, GObject

counter = 0

def callback(*args):
    global counter
    counter += 1
    print 'callback called', counter
    if counter > 10:
        print 'last call'
        return False

    return True

def terminate(*args):
    print 'Bye bye'
    loop.quit()

GObject.timeout_add(100, callback)
GObject.timeout_add(3000, terminate)
loop = GLib.MainLoop()
loop.run()

コールバックが戻った場合、コールバックはFalse削除され、呼び出されなくなります。コールバックを再度呼び出す場合は、コールバックを返すTrue必要があります(関数で確認できますcallback)。

terminateループを終了する方法を示すために、別のコールバックを設定しました。明示的に行わない場合、GLibはさらにイベントを待機し続けます(何をしたいかを知る方法がありません)。

PyGTK(古くて非推奨)を使用すると、コードは次のようになります。

import gobject, glib, gtk

counter = 0

def callback(*args):
    global counter
    counter += 1
    print 'callback called', counter
    if counter > 10:
        print 'last call'
        return False

    return True

def terminate(*args):
    print 'Bye bye'
    loop.quit()

gobject.timeout_add(100, callback)
gobject.timeout_add(3000, terminate)
loop = glib.MainLoop()
loop.run()
于 2012-10-17T07:01:21.057 に答える
0

同じ問題が発生したので、gtk.gdk.threads_init()call の前にこれを追加しますgtk.mainloop()。それは私とうまく動作します

于 2017-08-09T04:05:25.307 に答える