1

私はこれについて多くのことをグーグルで調べましたが、探しているものがまだ見つかりません。これは古典的な質問だと思いますが、まだ理解できません。

この Python/Tkinter コードがあります。このコードは、CPU を大量に消費するプロセスをos.system(cmd). ユーザーに実際に何かが起こっていることを示すプログレスバー(プログレッシブではなく、振動するバー)が必要です。os.systemを呼び出す前にプログレスバーを含むスレッドを開始し、プログレスバースレッドの実行中に呼び出しos.system、プログレスバースレッドを閉じて Associate を破棄する必要があると思いますToplevel()

つまり、Python は非常に柔軟ですが、それほど苦労せずにこれを行うことは可能でしょうか? 別のスレッドからスレッドを強制終了するのは (データ共有のため) 安全ではないことはわかっていますが、私の知る限り、この 2 つのスレッドはデータを共有していません。

このように行くことは可能でしょうか:

progressbar_thread.start()
os.system(...)
progressbar_thread.kill()

それが不可能な場合でも、2 つのスレッド間で「シグナル」変数を渡す方法がわかりません。

ありがとうございました、

アンドレア

4

2 に答える 2

1

この場合、スレッドは必要ありません。subprocess.Popenサブプロセスを開始するために使用するだけです。

widget.after()プロセスが終了したときにGUIに通知するには、次の方法を使用してポーリングを実装できます。

process = Popen(['/path/to/command', 'arg1', 'arg2', 'etc'])
progressbar.start()

def poller():
    if process.poll() is None: # process is still running
       progressbar.after(delay, poller)  # continue polling
    else:
       progressbar.stop() # process ended; stop progress bar

delay = 100  # milliseconds
progressbar.after(delay, poller) # call poller() in `delay` milliseconds

待たずに手動でプロセスを停止したい場合:

if process.poll() is None: # process is still running
   process.terminate()
   # kill process in a couple of seconds if it is not terminated
   progressbar.after(2000, kill_process, process)

def kill_process(process):
    if process.poll() is None:
        process.kill()
        process.wait()

これが完全な例です。

于 2012-11-13T18:48:02.773 に答える
1

これはあなたが求めているタイプのものですか?

from Tkinter import *
import ttk, threading

class progress():
    def __init__(self, parent):
            toplevel = Toplevel(tk)
            self.progressbar = ttk.Progressbar(toplevel, orient = HORIZONTAL, mode = 'indeterminate')
            self.progressbar.pack()
            self.t = threading.Thread()
            self.t.__init__(target = self.progressbar.start, args = ())
            self.t.start()
            #if self.t.isAlive() == True:
             #       print 'worked'

    def end(self):
            if self.t.isAlive() == False:
                    self.progressbar.stop()
                    self.t.join()


def printmsg():
    print 'proof a new thread is running'


tk = Tk()
new = progress(tk)
but1 = ttk.Button(tk, text= 'stop', command= new.end)
but2 = ttk.Button(tk, text = 'test', command= printmsg)
but1.pack()
but2.pack()
tk.mainloop()
于 2012-11-13T11:06:39.873 に答える