所以我有这部分代码,它做了一件简单的事情:它启动一个脚本,当脚本正在处理时,一个throbator被设置为打开。
def go(self):
if ui.chk.isChecked():
self.startThrobber()
script = subprocess.check_call(r'"C:Program FilesFMEfme.exe"', shell=False)
if script == 0:
self.stopThrobber() # opens a QMessageBox and stops throbber
else:
QMessageBox.information(self.popup(), "Errpr", "Error !")
在尝试不同的方法(QThread, subprocess。)这是我能让它工作的最接近的。
唯一不能工作的是 throbator 没有在subprocess
执行之前开始,它在之后开始,因此它永远不会停止。
那么为什么在执行stopThrobber()
时throbber没有结束?为什么startThrobber
没有在subprocess
之前执行(我很确定这是一个子进程的事情,但我对这一切都很陌生,直到昨天才听说线程)
编辑:单引号只是个打字错误,抱歉。还是不能解决问题
任何调用子进程,从你的主线程,这是阻塞(等待返回)将阻止你的抽动器正常工作。我对您关于此主题的其他SO问题的回答概述了一种不会导致子进程调用阻塞主线程的方法。我应该指出,该解决方案并不是创建对子进程的非阻塞调用的唯一方法(例如,请参阅此处)。您可以创建一个QTimer
来定期轮询子进程poll()
方法,以便您可以检查returncode
以查看子进程是否已经完成。
关键的主题是,你需要你的方法在主线程中运行,以保持GUI响应和允许你的throbber运行/动画快速返回。因此,选择一种方式来启动满足此需求的子流程。
表示原始字符串的单引号将'shell'参数括起来。
def go(self):
if ui.chk.isChecked():
self.startThrobber()
script = subprocess.check_call(r"C:Program FilesFMEfme.exe", shell=False)
if script == 0:
self.stopThrobber() # opens a QMessageBox and stops throbber
else:
QMessageBox.information(self.popup(), "Errpr", "Error !")
所以我尝试了另一件事(不成功…)当我单击按钮时,它执行startThrobber()并向以下函数发送信号:
def go(self):
self.startThrobber()
script = subprocess.Popen(r'"C:Program FilesFMEfme.exe" ', shell=False)
while script.poll() == None:
time.sleep(1)
else:
p.stopThrobber()
但仍然不工作…startThrobber被执行,但GUI上什么也没有出现…我认为子进程的要点是允许同时执行多个任务,那么为什么不出现throbber呢?
UPDATE:如果我擦除while循环,startThrobber工作:它在子进程转动时出现。那么为什么当有while循环时它不工作呢?!