因此,我有这部分代码,它做了一件简单的事情:它启动一个脚本,当脚本正在处理时,一个throbber设置为on。
def go(self):
if ui.chk.isChecked():
self.startThrobber()
script = subprocess.check_call(r'"C:\Program Files\FME\fme.exe"', shell=False)
if script == 0:
self.stopThrobber() # opens a QMessageBox and stops throbber
else:
QMessageBox.information(self.popup(), "Errpr", "Error !")尝试不同的方法(QThread,subprocess.Popen .)这是我最想让它运转的地方。
唯一不起作用的是,throbber没有在执行subprocess之前启动,而是在执行之后开始,因此它从未停止过。
那么,为什么当执行stopThrobber()时,throbber没有结束呢?为什么startThrobber没有在subprocess之前被执行(我确信这是一个子进程问题,但我对所有这些都很陌生,直到昨天才听说过线程)。
编辑:单引号只是输入错误,对不起。还是没能解决问题。
发布于 2015-06-02 08:13:59
从主线程对子进程的任何调用,即阻塞(等待返回),都将阻止您的throbber正常工作。关于这个主题的问题,我的answer概述了一种不会导致子进程调用阻塞主线程的方法。我应该指出,解决方案不是创建子进程非阻塞调用的唯一方法(例如,请参见here )。您可以创建一个QTimer来定期轮询子进程poll()方法,这样您就可以检查子进程是否完成了returncode。)
关键的主题是,您需要在主线程中运行的方法快速返回,以保持GUI响应,并允许您的throbber运行/动画。因此,选择一种方式来启动满足这一要求的子流程。
发布于 2015-06-01 15:59:35
表示原始字符串的单引号将“shell”参数括起来。
def go(self):
if ui.chk.isChecked():
self.startThrobber()
script = subprocess.check_call(r"C:\Program Files\FME\fme.exe", shell=False)
if script == 0:
self.stopThrobber() # opens a QMessageBox and stops throbber
else:
QMessageBox.information(self.popup(), "Errpr", "Error !")发布于 2015-06-03 09:08:04
所以我又尝试了一件事(没成功.)当我单击一个按钮时,它执行startThrobber()并向以下函数发送信号:
def go(self):
self.startThrobber()
script = subprocess.Popen(r'"C:\Program Files\FME\fme.exe" ', shell=False)
while script.poll() == None:
time.sleep(1)
else:
p.stopThrobber()但还是没用..。startThrobber被执行,但是GUI上什么也没有出现.我认为子进程的意义是允许同时执行多个任务,那么为什么throbber没有出现呢?
UPDATE:如果我擦除while循环,startThrobber就会工作:当子进程正在转动时,它就会出现。那么,为什么当有while循环时,它就不工作了?!
https://stackoverflow.com/questions/30576681
复制相似问题