首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Subprocess.check_call和throbber不工作

Subprocess.check_call和throbber不工作
EN

Stack Overflow用户
提问于 2015-06-01 14:54:48
回答 3查看 205关注 0票数 0

因此,我有这部分代码,它做了一件简单的事情:它启动一个脚本,当脚本正在处理时,一个throbber设置为on。

代码语言:javascript
复制
   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之前被执行(我确信这是一个子进程问题,但我对所有这些都很陌生,直到昨天才听说过线程)。

编辑:单引号只是输入错误,对不起。还是没能解决问题。

EN

回答 3

Stack Overflow用户

发布于 2015-06-02 08:13:59

从主线程对子进程的任何调用,即阻塞(等待返回),都将阻止您的throbber正常工作。关于这个主题的问题,我的answer概述了一种不会导致子进程调用阻塞主线程的方法。我应该指出,解决方案不是创建子进程非阻塞调用的唯一方法(例如,请参见here )。您可以创建一个QTimer来定期轮询子进程poll()方法,这样您就可以检查子进程是否完成了returncode。)

关键的主题是,您需要在主线程中运行的方法快速返回,以保持GUI响应,并允许您的throbber运行/动画。因此,选择一种方式来启动满足这一要求的子流程。

票数 2
EN

Stack Overflow用户

发布于 2015-06-01 15:59:35

表示原始字符串的单引号将“shell”参数括起来。

代码语言:javascript
复制
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 !")
票数 0
EN

Stack Overflow用户

发布于 2015-06-03 09:08:04

所以我又尝试了一件事(没成功.)当我单击一个按钮时,它执行startThrobber()并向以下函数发送信号:

代码语言:javascript
复制
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循环时,它就不工作了?!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30576681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档