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