仅在调用'os.system()'之前运行某些语句 [英] Runs only some statements before 'os.system()' is called

查看:41
本文介绍了仅在调用'os.system()'之前运行某些语句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在编写一个Python程序,该程序具有使用PyQt5的GUI,并且还使用os.system()调用MATLAB文件。但是,我有一个函数决定在调用os.system之前不执行任何与PyQt相关的语句。像"print"这样的正常函数在os.system之前运行,但其他函数不会。但是,它会在调用os.system之后正常运行它们

Ex)

def button_clicked(self):
    print("Button Clicked")    #works
    self.label.hide()          #does nothing

    os.system()                #MATLAB called. works

    self.label.hide()          #now works

我完全不知道为什么会发生这种情况。真正奇怪的是,程序似乎忽略了os.system之前函数中与PyQt相关的所有内容,因为即使我执行以下操作:

def myFunction(self):
    self.label.hide()
    self.label2.hide()
    print("myFunction Called")  

def button_clicked(self):
    self.label.hide()          #does nothing
    self.label2.hide()         #does nothing
    print("Button Clicked")    #works
    self.myFunction()          #does everything in the function unless it's PyQt-related, in this instance, it prints "myFunction Called" and nothing else

    os.system()                #MATLAB called. Works

    self.label.hide()         #now works
    self.label2.hide()        #now works

os.system总是在函数或其他什么地方首先执行吗?但这并不能解释为什么像"打印"这样的东西是有效的。

推荐答案

os.system()阻止。这意味着它不会返回,直到它调用的命令实际返回(例如:程序退出)。

对于Qt这样的事件驱动系统而言,这是一个可怕的错误,因为阻塞函数会阻止事件循环处理所有事件:不仅是来自系统的事件(如键盘或鼠标交互),还包括它自己的事件,最重要的是小工具的绘图

您的标签实际上对Qt的视点是隐藏的(您可以尝试print(self.label.isVisible())),但是由于您要在那之后立即调用os.system,Qt没有时间以可视方式更新小工具以反映这一点。

虽然通常线程化(根据需要,可以使用Python自己的模块或Qt的QThread,甚至可以使用QRunnable)是潜在阻塞操作的首选,但是由于您实际上想启动一个新程序,所以最简单的解决方案是使用Qprocess,也许可以使用它自己的静电方法startDetached()

这篇关于仅在调用'os.system()'之前运行某些语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆