我正在编写一个GUI界面,用于rvplayer的自动渲染日报和附带信息。这个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 在单独的线程或后台运行该过程。