2

私は1時間探していましたが、これに対する決定的な答えを見つけることができません.

コマンドラインツールを起動するボタンを持つwxPython GUIアプリを作成しようとしています(すべてWindows上)。ツールの実行には約 5 分かかり、進行中に出力が生成されます。

GUI に、出力が発生したときにその出力を表示する何らかのテキスト ウィンドウが必要です。また、GUI を強制終了して、コマンド ライン プロセスを終了したいと思います。

私はスレッドと Popen を調べましたが、これらすべてを正しく接続してこの作業を行うことができないようです。誰かが私に賢明な例を指摘できますか?

4

2 に答える 2

2

GooeyPiアプリの wxPython でこれとまったく同じことを行います。pyInstaller コマンドを実行し、出力を 1 行ずつ textctrl に取り込みます。

アプリのメイン フレームには、以下を呼び出すボタンがありますOnSubmit

def OnSubmit(self, e):
    ...
     # this is just a list of what to run on the command line, something like [python, pyinstaller.py, myscript.py, --someflag, --someother flag]
    flags = util.getflags(self.fbb.GetValue())
    for line in self.CallInstaller(flags): # generator function that yields a line
        self.txtresults.AppendText(line) # which is output to the txtresults widget here

コマンドを実際にCallInstaller実行し、wx.Yield() を実行するだけでなく行を生成するので、画面がひどくフリーズすることはありません。これを独自のスレッドに移動できますが、私は気にしませんでした。

def CallInstaller(self, flags):
        # simple subprocess.Popen call, outputs both stdout and stderr to pipe
        p = subprocess.Popen(flags, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
        while(True): 
            retcode = p.poll() # waits for a return code, until we get one..
            line = p.stdout.readline() # we get any output
            wx.Yield() # we give the GUI a chance to breathe
            yield line # and we yield a line
            if(retcode is not None): # if we get a retcode, the loop ends, hooray!
                yield ("Pyinstaller returned return code: {}".format(retcode))
                break
于 2013-09-03T15:32:03.053 に答える
2

私はあなたが話している線に沿って何かをした記事を書きました。ping と traceroute を実行し、それらの出力をリアルタイムでキャプチャする必要がありました。記事は次のとおりです。 http://www.blog.pythonlibrary.org/2010/06/05/python-running-ping-traceroute-and-more/

基本的に、stdout をテキスト コントロールにリダイレクトしてから、次のようにする必要があります。

proc = subprocess.Popen("ping %s" % ip, shell=True, 
                            stdout=subprocess.PIPE) 
line = proc.stdout.readline()
print line.strip()

ご覧のとおり、subprocess を使用して ping を開始し、その stdout を読み取ります。次に、strip() コマンドを使用して、行の先頭と末尾から余分な空白を削除してから出力します。印刷を行うと、テキスト コントロールにリダイレクトされます。

于 2013-09-03T13:46:07.637 に答える