我正在使用PyGTK开发一个简单的应用程序。我有一个按钮,当它点击时在ubuntu中运行一个子进程。我希望在单击按钮后立即更改状态栏,并在子流程完成后更改一次。但目前它没有正常工作,因为它等待子进程完成,然后只将状态栏更改为" Done"。我的代码现在是这样的:
def on_button_clicked(self, widget):
self.statusBar.push(1, "Doing the subprocess...")
command = '...'
print subprocess.call(command,shell=True)
...
self.statusBar.push(1, "Done!")
我以为我可以在另一个函数中更改状态栏,然后调用函数来完成剩下的工作,但它没有工作(听起来很傻!)。我应该如何更改我的代码以显示"执行子流程..."命令在后台运行时的状态?
答案 0 :(得分:2)
如您所知,subprocess.call()
会阻塞,直到命令完成。你想要做的是在另一个线程中运行子进程调用,然后,一旦调用完成,从线程更新状态栏。
def _do_subproc(command, bar):
subprocess.call(command, shell=True)
glib.idle_add(bar.push, 1, "Done!") # call bar.push in the main GUI thread
def on_button_clicked(self, widget):
self.statusBar.push(1, "Doing the subprocess...")
command = '...'
threading.Thread(target=lambda: _do_subproc(command, self.statusBar)).start()
您可能希望将按钮灰显以防止用户点击垃圾邮件。