2

こんにちは、平均 30 分間実行されるコマンドがあります。GTK3 によって作成されたボタンをクリックすると、Python がコマンドの実行を開始しますが、すべてのアプリケーションがフリーズします。クリックされたボタンの私のpythonコードは次のとおりです。

def on_next2_clicked(self,button):
    cmd = "My Command"
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
    while True:
            line = proc.stdout.read(2)
            if not line:
                break
            self.fper = float(line)/100.0
            self.ui.progressbar1.set_fraction(self.fper)
    print "Done"

コマンドの出力をウィンドウの進行状況バーに設定する必要もあります。誰でも私の問題を解決するのに役立ちますか? 私もPythonでThreadingを試しましたが、それも役に立たない...

4

2 に答える 2

3

ループ内からメイン ループの繰り返しを実行します。

def on_next2_clicked(self,button):
    cmd = "My Command"
    proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
    while True:
        line = proc.stdout.read(2)
        if not line:
            break
        self.fper = float(line)/100.0
        self.ui.progressbar1.set_fraction(self.fper)
        while Gtk.events_pending():
            Gtk.main_iteration()  # runs the GTK main loop as needed
    print "Done"
于 2012-06-26T07:21:35.843 に答える
1

UI メイン イベント ループを実行させずに待機中です。ループを別のスレッドに配置して、メイン スレッドが独自のイベント ループを続行できるようにします。

編集:サンプルコードの追加

import threading

def on_next2_clicked(self,button):
    def my_thread(obj):
        cmd = "My Command"
        proc = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE)
        while True:
                line = proc.stdout.read(2)
                if not line:
                    break
                obj.fper = float(line)/100.0
                obj.ui.progressbar1.set_fraction(obj.fper)
        print "Done"

    threading.Thread(target=my_thread, args=(self,)).start()

関数に対する上記の変更により、メイン スレッドと並行して実行される新しいスレッドが開始されます。新しいスレッドがビジー状態で待機している間、メイン イベント ループを続行させます。

于 2012-06-26T05:35:13.563 に答える