1

問題を次の単純なサンプルスクリプトに減らしました。

#! /usr/bin/python

import hello
from threading import Thread

def myfunc():

        hello.HelloWorld().main()

t = Thread(target=myfunc)
t.start()

print '\nstill running ???'

問題は、gtkイベントループのブロッキング動作を回避する方法を見つけようとしていることです。これは可能ですか?ご覧のとおり、別のスレッドからクラスを呼び出した場合でも、イベントループはメインスクリプトのそれ以上の進行をブロックします(「まだ実行中???」はgtkアプリケーションが閉じられるまで出力されません)

4

1 に答える 1

1

pyGTKのスレッド化のベストプラクティスを読む必要があります。GTKはメインスレッドで使用する必要がありますが、それでも、それは奇妙だと思います。

私は次のコードを試しました:

#! /usr/bin/python

import gtk
from time import sleep
from threading import Thread


def myfunc():
    w = gtk.Window()
    l = gtk.Label()
    w.add(l)
    w.show_all()
    w.connect("destroy", lambda _: gtk.main_quit())
    gtk.main()

def myfunc2():
    sleep (3)

t = Thread(target=myfunc)
#t = Thread(target=myfunc2)
t.start()

print '\nstill running ???'

さらに悪いことに、ほとんどの場合、メッセージはアプリを閉じた後に印刷されますが、前に表示されることもあります。ですから、ここには奇妙な振る舞いがあります。

于 2012-09-13T08:29:16.690 に答える