Subprocess.check_call和throbber无法正常工作

时间:2015-06-01 14:54:48

标签: python user-interface pyqt subprocess pyqt5

所以我有这部分代码做了一件简单的事情:它启动一个脚本,当脚本正在处理时,就会设置一个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之前被执行(我很确定它是一个子进程的东西,但我对这一切都很新,从未听说过线程直到昨天)

编辑: 单引号只是输入错误,抱歉。仍然没有解决问题。

3 个答案:

答案 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循环它不起作用?!