【发布时间】:2015-03-05 16:03:43
【问题描述】:
我目前正在为 rvplayer 编写一个 GUI,它将使艺术家能够自动渲染带有 slate 和老化信息的样片。 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 在单独的线程或后台运行进程。
【问题讨论】:
-
我想知道如果你在后台线程中运行它是否也会发生这种情况?有关详细信息,请参阅stackoverflow.com/a/22060122/1536976。
-
一篇关于你的问题的好文章可以在这里找到:doc.qt.digia.com/qq/qq27-responsive-guis.html
标签: python user-interface pyside freeze