【问题标题】:How to update the progress bar using with pyqt4如何使用 pyqt4 更新进度条
【发布时间】:2023-04-03 19:53:02
【问题描述】:

这是示例程序,我想使用 pyqt4 更新我的进度条。我想显示 th3 30% 的数据保存和另一个 60% 的数据处理。我正在执行它正在中止的程序。任何人都可以请帮助我如何更新我的进度条。提前谢谢你。 下面是我的代码:

import sys
import time
from pyface.qt import QtGui, QtCore
global X,Y
X= 5
Y= 4

import threading
class SaveWorker(QtCore.QObject):
    progress_update = QtCore.Signal(int)
    def save_file(self):
        while True:
            MyCustomWidget().updateProgressBar()

class Dialog(QtGui.QDialog):
    def __init__(self, parent = None):
        super(Dialog, self).__init__(parent)
        self.setStyleSheet("QDialog {background-color:black; color:white }")
        self.label1 = QtGui.QLabel(
            text="Please Wait...",
            font=QtGui.QFont("Times", 20,weight=QtGui.QFont.Bold)
        )
        self.progress = QtGui.QProgressBar()
        self.box = QtGui.QVBoxLayout()
        self.label2 = QtGui.QLabel()
        vbox = QtGui.QVBoxLayout(self)
        vbox.addWidget(self.label1)
        vbox.addLayout(self.box)
        self.show_gif()
    def show_gif(self):
        self.progress = QtGui.QProgressBar()
        self.progress.setRange(0,100)

        self.box.addWidget(self.progress)
        self.show()
class MyCustomWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super(MyCustomWidget, self).__init__(parent)
        self.worker = SaveWorker()
        self.gif_dialog = Dialog()
        self.worker.progress_update.connect(self.gif_dialog.show_gif)
        thread = threading.Thread(target=self.worker.save_file)
        thread.daemon = True
        thread.start()
        self.progressPer = 0
        fileList = []

        processes = []
        _dataSavingPer = 30.0/(X*Y)
        for i in range(X*Y):
            name =  'file'+str(i+1) + ".txt"
            fileList.append(name)
            self.progressPer += _dataSavingPer
            self.updateProgressBar(self.progressPer)
            #updating the progress bar
        _dataProcessPer = 60.0/(X*Y)
        for file in fileList:
            process = 'fileProcess'+str(i+1) + ".txt"
            processes.append(process)
            self.progressPer += _dataProcessPer
            self.updateProgressBar(self.progressPer)
            #Updating the progressPer
            #how can i update these two values in to progressbar
    def updateProgressBar(self,value):
            self.gif_dialog.progress.setValue(value)
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    window = MyCustomWidget()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python python-2.7 pyqt pyqt4


    【解决方案1】:

    我不明白您在编写以下内容时尝试了什么:

    class SaveWorker(QtCore.QObject):
        progress_update = QtCore.Signal(int)
        def save_file(self):
            while True:
                MyCustomWidget().updateProgressBar()
    

    updateProgressBar 需要一个值 你正在经历什么值?另一方面,当使用MyCustomWidget() 时,你正在创建一个与所示对象不同的对象,并且不应在另一个线程中创建MyCustomWidget 对象。

    你要做的是将繁重的任务移到 save_file 方法,因为它将在另一个线程中执行:

    import sys
    import threading
    from pyface.qt import QtGui, QtCore
    
    X, Y = 5, 4
    
    class SaveWorker(QtCore.QObject):
        progressChanged = QtCore.Signal(int)
    
        def save_file(self):
            fileList = []
            processes = []
            _dataSavingPer = 30.0/(X*Y)
            progress = 0
            for i in range(X*Y):
                name =  'file'+str(i+1) + ".txt"
                fileList.append(name)
                progress += _dataSavingPer
                self.progressChanged.emit(progress)
            _dataProcessPer = 60.0/(X*Y)
            for file in fileList:
                process = 'fileProcess'+str(i+1) + ".txt"
                processes.append(process)
                progress += _dataProcessPer
                self.progressChanged.emit(progress)
    
    class Dialog(QtGui.QDialog):
        def __init__(self, parent = None):
            super(Dialog, self).__init__(parent)
            self.setStyleSheet("QDialog {background-color:black; color:white }")
            self.label1 = QtGui.QLabel(
                text="Please Wait...",
                font=QtGui.QFont("Times", 20,weight=QtGui.QFont.Bold)
            )
            self.progress = QtGui.QProgressBar()
            self.box = QtGui.QVBoxLayout()
            self.label2 = QtGui.QLabel()
            vbox = QtGui.QVBoxLayout(self)
            vbox.addWidget(self.label1)
            vbox.addLayout(self.box)
            self.show_gif()
    
        def show_gif(self):
            self.progress = QtGui.QProgressBar()
            self.progress.setRange(0,100)
            self.box.addWidget(self.progress)
            self.show()
    
    class MyCustomWidget(QtGui.QWidget):
        def __init__(self, parent=None):
            super(MyCustomWidget, self).__init__(parent)
            self.worker = SaveWorker()
            self.gif_dialog = Dialog()
            self.worker.progressChanged.connect(self.gif_dialog.progress.setValue)
            thread = threading.Thread(target=self.worker.save_file)
            thread.daemon = True
            thread.start()
    
    if __name__ == "__main__":
        app = QtGui.QApplication(sys.argv)
        window = MyCustomWidget()
        sys.exit(app.exec_())
    

    【讨论】:

    • 先生 90% 是正确的,但我想显示 % 分别是 30% 用于保存数据和 60% 处理数据,并且文件循环的每次迭代我想更新百分比
    • @gowthami 它正在更新,但在当前情况下,for 循环非常快,您的眼睛不会察觉到变化
    • 是的先生刚才我使用time.sleep方法验证了非常感谢您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2016-08-17
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多