Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PySide/pythongui冻结_Python_User Interface_Pyside_Freeze - Fatal编程技术网

PySide/pythongui冻结

PySide/pythongui冻结,python,user-interface,pyside,freeze,Python,User Interface,Pyside,Freeze,我目前正在为rvplayer编写一个GUI,它将使艺术家能够使用石板和老化信息自动渲染日报。GUI是用PySide编写的,并用Python 2.7编写脚本。我的问题是,在调用我的进程并用标准输出更新我的QProgressBar时,GUI冻结。我知道这是一个常见的问题,可能可以通过processEvents()以某种方式解决,但我对线程和进程循环知之甚少,因此无法了解这个问题。由于我的代码已经有点长了,下面是导致问题的部分: def rv(self, args): p = subproce

我目前正在为rvplayer编写一个GUI,它将使艺术家能够使用石板和老化信息自动渲染日报。GUI是用PySide编写的,并用Python 2.7编写脚本。我的问题是,在调用我的进程并用标准输出更新我的
QProgressBar
时,GUI冻结。我知道这是一个常见的问题,可能可以通过
processEvents()
以某种方式解决,但我对线程和进程循环知之甚少,因此无法了解这个问题。由于我的代码已经有点长了,下面是导致问题的部分:

def rv(self, args):
    p = subprocess.Popen(["C:/Program Files/Tweak/RV-4.0.10-64/bin/rvio_hw.exe"]+[x for x in args], stdout=subprocess.PIPE)
    while True:
        line = p.stdout.readline()
        if line != "":
            progressStr=re.search(r"([0-9]+.[0-9]+%)", line.rstrip())
            if progressStr == None:
                print line.rstrip()
            else:
                progressInt=int(float(re.sub("[^0123456789\.]", "", progressStr.group())))
                self.prog_QProgressBar.setValue(progressInt)
                print progressStr.group()
        else:       
            break
下面是启动我的
QApplication
的部分:

if __name__ == "__main__":

    app = QtGui.QApplication(sys.argv)
    finalForm = MainWindow()
    finalForm.show()
    sys.exit(app.exec_())

我在按下按钮后调用函数rv,尽管进度条保持正常更新,但一段时间后窗口开始无响应。我不明白在哪一点上我可以使用
app.processEvents()
告诉我的QApplication在单独的线程或后台运行该进程。

问题是,你的应用程序并不是被冻结的,而是Windows认为应用程序被冻结了,因为它忽略了事件(鼠标悬停、单击等),所以Windows明智地,给你这个对话


您需要在show()之后启动线程,然后运行processEvents函数,并且显然只有在线程完成后才调用sys.exit。

因为看起来您没有使用线程,所以可能只需要在更新进度条后调用
processEvents
,如下所示:

    self.prog_QProgressBar.setValue(progressInt)
    QtGui.qApp.processEvents()

然而,这种方法的有效性可能取决于该过程产生输出所需的时间。
processEvents
调用所做的就是立即处理当前在应用程序事件队列中的任何挂起事件(例如小部件绘制、鼠标单击等)。在这些调用之间,GUI将继续冻结(即,执行代码不会像您建议的那样在单独的线程或后台运行)。因此,这种技术能够保持GUI响应的程度取决于在
rv()
方法中调用
processEvents
的频率

我想知道如果在后台线程中运行它是否也会发生这种情况?有关更多详细信息,请参阅。有关您的问题的文章可在此处找到: