![](/img/trans.png)
[英]PySide2/Qt for python : The GUI freezes when i click the button
[英]PySide / Python GUI freezes
我目前正在为rvplayer编写一个GUI,它可以让艺术家自动使用平板和老化信息来呈现样片。 GUI使用PySide编写,并在Python 2.7中编写脚本。 我的问题是,在调用我的进程并使用stdout更新我的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在单独的线程或后台运行该进程。
因为看起来你没有使用线程,所以所需要的只是在更新进度条后调用processEvents
,如下所示:
self.prog_QProgressBar.setValue(progressInt)
QtGui.qApp.processEvents()
但是,这种效果可能取决于生产输出过程需要多长时间。 processEvents
调用的所有操作都是立即处理当前在应用程序事件队列中的任何挂起事件(例如,小部件绘制,鼠标单击等)。 在这些调用之间,GUI将继续冻结(即执行代码不在单独的线程中或在后台运行,如您所建议的那样)。 因此,此技术可以保持GUI响应的程度取决于在rv()
方法中调用processEvents
频率。
问题是,它不像你的应用程序被冻结,但是Windows认为该应用程序被冻结,因为它忽略了事件(鼠标悬停,点击等等),因此Windows以其智慧为您提供了对话。
你需要在show()之后启动线程然后运行processEvents函数,显然只有在线程完成后才调用sys.exit。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.