仅在调用'os.system()'之前运行某些语句

2022-02-23 00:00:00 python function pyqt pyqt5

问题描述

我正在编写一个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()

相关文章