所以我有这部分代码做了一件简单的事情:它启动一个脚本,当脚本正在处理时,就会设置一个throbber。
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()
被执行时悸动没有结束?
为什么startThrobber
没有在subprocess
之前被执行(我很确定它是一个子进程的东西,但我对这一切都很新,从未听说过线程直到昨天)
编辑: 单引号只是输入错误,抱歉。仍然没有解决问题。
答案 0 :(得分:2)
来自主线程的子进程对阻塞(等待返回)的任何调用都将阻止你的操作员正常工作。我对此主题的另一个问题answer概述了一种不会导致子进程调用阻塞主线程的方法。我应该指出,解决方案不是创建对子流程的非阻塞调用的唯一方法(例如,请参阅here。您可以创建QTimer
来轮询子流程poll()
方法定期,以便您可以检查returncode
以查看子流程是否已完成。)
关键主题是您需要在主线程中运行的方法快速返回,以保持GUI响应并允许您的悸动者运行/动画。因此,选择一种方法来启动满足此要求的子流程。
答案 1 :(得分:0)
表示原始字符串的单引号括起'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 !")
答案 2 :(得分:0)
所以我尝试了另一件事(失败了......) 当我点击一个按钮时,它会执行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循环它不起作用?!