子流程.Check_call和throbber不工作



所以我有这部分代码,它做了一件简单的事情:它启动一个脚本,当脚本正在处理时,一个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循环时它不工作呢?!

相关内容

  • 没有找到相关文章

最新更新