PyQt 进度条 QThread 不正常工作

2 投票
1 回答
1904 浏览
提问于 2025-04-17 21:35

我在写代码的时候遇到了一个问题。我想用进度条来显示一个循环的进度。我打算使用Qthread来实现这个功能。下面的代码虽然能部分工作,但并不是完全正确。进度条确实显示了循环的进度,但不是通过线程来实现的,也就是说,如果我多次点击“停止”,界面就会卡住。

我对QtCore不是很熟悉。请问有没有人能帮我,告诉我为什么它不能像我想的那样工作呢?

非常感谢!

from PyQt4 import QtGui, QtCore

#Progressbar
class MyCustomWidget(QtGui.QWidget):

    def __init__(self, parent=None):
        super(MyCustomWidget, self).__init__(parent)
        layout = QtGui.QVBoxLayout(self)       

        self.progressBar = QtGui.QProgressBar(self)
        self.progressBar.setRange(0,100)
        layout.addWidget(self.progressBar)

    #Update Progressbar
    def onProgress(self, i):
        self.progressBar.setValue(i)
        if self.progressBar.value() >= self.progressBar.maximum():
            self.close()

#Threading Class
class ASA(QtCore.QThread):
    notifyProgress = QtCore.pyqtSignal(int)
    def run(self, i):

        #Sends the new information to the Update Function
        self.notifyProgress.emit(i)
        time.sleep(0.01)

#-----------------------------------------#
#Main Function
app = QtGui.QApplication(sys.argv)
bar = MyCustomWidget()
bar.show()

bar.asa = ASA()
bar.asa.notifyProgress.connect(bar.onProgress)
bar.asa.start()

#For loop for the progressbar
for i in range(105):
    ASA.run(bar.asa, i)
    time.sleep(0.5)  

sys.exit(app.exec_())

1 个回答

2

这个循环需要在线程内部运行:

def run(self):
    #Sends the new information to the Update Function
    for i in range(105):
        self.notifyProgress.emit(i)
        time.sleep(0.01)

撰写回答