Python PyQt4 进度条冻结 GUI

1 投票
2 回答
3227 浏览
提问于 2025-04-16 16:10

以下的代码是用来计算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

撰写回答