私は完了するまでに(おそらく1分または2分かかる)プロセスがあります。これをpygtkのGUIから呼び出すと、約10秒後にウィンドウがロックアップ(暗くなり、ユーザーの操作を妨げる)します。長時間実行中のプロセスでpygtk GUIがロックされないようにします
私はこれをやめないようにしたいと思いますが、どうしたらよいか分かりません。私はマルチスレッドが答えになると思っていましたが、動作していないようです。私はオンラインで見つけた2つの方法を試しました。まず、this FAQを変更して長時間実行するようにしました。第二に私はthis answerのように直接threading.Threadを使ってみましたが、それもロックアップします。
私の2つのサンプルは以下の通りです。私はマルチスレッド化に新しいので、おそらくそれは私が探している解決策ではありません。私は基本的にGUIをロックしないようにしているので、プログレスバーで更新して、ユーザーにキャンセルボタンを使用させることができます。
#Sample 1
import threading
import time
import gobject
import gtk
gobject.threads_init()
class MyThread(threading.Thread):
def __init__(self, label, button):
super(MyThread, self).__init__()
self.label = label
self.button = button
self.counter = 0
button.connect("clicked", self.on_button_click)
self.quit = False
def update_label(self, counter):
self.label.set_text("Counter: %i" % counter)
time.sleep(20)
return False
def on_button_click(self, widget):
self.counter += 1
gobject.idle_add(self.update_label, self.counter)
window = gtk.Window()
label = gtk.Label()
box = gtk.VBox()
button = gtk.Button("Test")
box.pack_start(label)
box.pack_start(button)
window.add(box)
window.show_all()
window.connect("destroy", lambda _: gtk.main_quit())
thread = MyThread(label, button)
thread.start()
gtk.main()
thread.quit = True
#####################################
#Sample 2
from threading import Thread
import time
import gobject
import gtk
class Test():
def __init__(self):
self.counter = 0
self.label = gtk.Label()
button = gtk.Button("Test")
window = gtk.Window()
box = gtk.VBox()
box.pack_start(self.label)
box.pack_start(button)
window.add(box)
window.connect("destroy", lambda _: gtk.main_quit())
button.connect("clicked", self.on_button_click)
window.show_all()
def update_label(self, counter):
self.label.set_text("Counter: %i" % counter)
time.sleep(20)
return False
def on_button_click(self, widget):
self.counter += 1
thread = Thread(target=self.update_label, args=(self.counter,))
thread.start()
while thread.is_alive():
pass
thread.stop()
test = Test()
gtk.main()
これは意味があります。私はスレッドの状態を常にポーリングできない理由を理解しています。しかし、私はスレッドが終了するときを知る必要があります。スレッドの進捗状況のステータスバーを追加すると、ステータスバーをいつ停止するかをどのように知ることができますか? –
例に進捗バーを追加しました。 'glib.timeout_add'は、あなたのアプリケーションが応答しなくてもスレッドの状態をポーリングすることができます。 – jcollado
大丈夫です。意味あり。私は 'glib.timeout_add'について知らなかった。ご協力いただきありがとうございます。 –