首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在初始化大数据时显示进度条

如何在初始化大数据时显示进度条
EN

Stack Overflow用户
提问于 2021-04-22 20:53:21
回答 1查看 51关注 0票数 0

我使用的是PyQt5。在下面代码的MainWindow.__init__过程中,我想初始化一些需要很长时间(例如20秒)的大数据(参见MainWindow.initData)。在此期间,我想显示一个进度条。只有在app.exec_()开始执行之后,才能显示进度条,因此我不能从MainWindow.__init__中调用initData。因此,我试图通过发布一个事件(postEvent)来执行initData,该事件将导致initData在app.exec_执行时执行。我查看了stackoverflow中的一些示例,并获得了以下代码。虽然会发布事件并调用initData,但直到initData完成后才会显示进度条。

请建议如何修改代码,以便在执行initData时显示进度条。谢谢。

代码语言:javascript
运行
复制
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QEvent

class MyEvent(QEvent):
    idType = QEvent.registerEventType()

    def __init__(self, data):
        QEvent.__init__(self, MyEvent.idType)
        self.data = data
        print("MyEvent.idType ", MyEvent.idType)

    def get_data(self):
        return self.data

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("My MainWindow")
        self.qProgressBar = QtWidgets.QProgressBar(self)
        self.qProgressBar.setGeometry(100, 100, 200, 30)

        self.label = QtWidgets.QLabel("Hello", self)
        self.label.setGeometry(50, 50, 200, 20)

        tempEvent = MyEvent("12345")
        QtWidgets.QApplication.postEvent(self, tempEvent)

    def initData(self):
        # To demonstrate, do something that takes a long time (for example
        # 20 seconds) and update progress bar.
        print("begin initData")
        loop = 10000
        for i in range(loop):
            self.qProgressBar.setValue(int((i+1)/loop*100))
            for j in range(loop):
                temp = i + j

    def customEvent(self, event):
        print("customEvent:", event.type())
        if (event.type() == MyEvent.idType):
            self.label.setText("Received : {0}".format(event.get_data()))
            self.initData()
    
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    screen = QtWidgets.QDesktopWidget().screenGeometry()
    w.setGeometry(screen.width()//2-200, screen.height()//2-200, 400, 400) # x, y, Width, Height
    w.show()
    
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-22 22:02:50

谢谢你。这是工作的最终结果!

代码语言:javascript
运行
复制
import sys
from PyQt5 import QtWidgets
from PyQt5.QtCore import QObject, QThread, pyqtSignal
from time import sleep

class Worker_InitData(QObject):
    finished = pyqtSignal()
    progress = pyqtSignal(int)

    def run(self):
        """Long-running task."""
        for i in range(10):
            sleep(1)
            self.progress.emit(i)
        self.finished.emit()

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.setWindowTitle("My MainWindow")
        self.qProgressBar = QtWidgets.QProgressBar(self)
        self.qProgressBar.setGeometry(100, 100, 200, 30)

        self.label = QtWidgets.QLabel("Hello", self)
        self.label.setGeometry(50, 50, 200, 20)

        self.initData()

    def reportProgress(self, i):
        self.qProgressBar.setValue(int((i+1)/10*100))
    
    def initData(self):
        # Step 2: Create a QThread object
        self.thread = QThread()
        # Step 3: Create a worker object
        self.worker = Worker_InitData()
        # Step 4: Move worker to the thread
        self.worker.moveToThread(self.thread)
        # Step 5: Connect signals and slots
        self.thread.started.connect(self.worker.run)
        self.worker.finished.connect(self.thread.quit)
        self.worker.finished.connect(self.worker.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)
        self.worker.progress.connect(self.reportProgress)
        # Step 6: Start the thread
        self.thread.start()
   
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()
    screen = QtWidgets.QDesktopWidget().screenGeometry()
    w.setGeometry(screen.width()//2-200, screen.height()//2-200, 400, 400) # x, y, Width, Height
    w.show()
    
    sys.exit(app.exec_())
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67213686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档