Python PyQt4 进度条冻结 GUI
以下的代码是用来计算PyQt4进度条的,最高到99%。我希望我的图形界面在进度条计数到99%时不要卡住。如果可以的话,我希望不使用自定义类或函数来实现这个功能。我知道使用类是个好主意,但对于这段小代码,我不想创建一个类。根据我所了解,可能有一个update()函数可以实现这个功能……请告诉我我是否在正确的方向上。
import sys
import time
from PyQt4 import QtGui
from PyQt4 import QtCore
app = QtGui.QApplication(sys.argv)
widget = QtGui.QWidget()
widget.resize(400, 200)
widget.setWindowTitle('simple')
widget.show()
shift = 0
cntControl = 5
barra = [0] * cntControl
for i in range(cntControl):
shift = shift + 10
barra[i] = QtGui.QProgressBar(widget)
barra[i].show()
barra[i].setMinimum(0)
barra[i].setMaximum(10000)
barra[i].setGeometry(QtCore.QRect(10, shift, 200, 10))
for a in range(10000):
for i in range(cntControl):
barra[i].setValue(a)
sys.exit(app.exec_())
2 个回答
0
我真的搞不定线程这个东西……我可以把我尝试写的线程代码发出来,乍一看对我(现在已经累了的)眼睛来说是没问题的……
不过,我确实调整了http://zetcode.com/tutorials/pyqt4/widgets/上的进度条示例,得到了以下代码……这解决了界面卡住的问题:
import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.setWindowTitle('ProgressBar')
self.setGeometry(300, 300, 250, 150)
self.pbar = [0] * 3
self.timer = [0] * 3
self.step = [0] * 3
self.shift = 0
for i in range(3):
self.shift = self.shift + 30
self.pbar[i] = QtGui.QProgressBar(self)
self.pbar[i].setGeometry(30, self.shift, 200, 25)
self.timer[i] = QtCore.QBasicTimer()
self.step[i] = 0
self.timer[i].start(100, self)
def timerEvent(self, event):
for i in range(3):
if self.step[i] >= 100:
self.timer[i].stop()
return
self.step[i] = self.step[i] + 1
self.pbar[i].setValue(self.step[i])
app = QtGui.QApplication(sys.argv) ex
= Example() ex.show() app.exec_()
我完全不知道为什么它能工作,这可能不是个好事。我猜这可能和super(Example, self).__init__()
以及pyqt4使用的自定义计时器有关。我真的希望能不使用函数或类来实现这个,但不太确定这是否可能。如果你觉得可以,欢迎分享你的想法!
1
试着把你的for循环改成这样:
while True:
for a in range(10000):
time.sleep(0.0001)
for i in range(cntControl):
barra[i].setValue(a)
这样对我有效。while循环会不停地移动进度条。如果你只是想在进度条到达末尾后清理它,你应该使用重置:
PySide.QtGui.QProgressBar.reset() Reset the progress bar. The progress bar “rewinds” and shows no progress
根据提问者的评论更新:如果你希望在执行一个很长的循环或其他操作时,界面能够保持响应,你应该使用Python的线程模块或者QThreads。