簡體   English   中英

在計算過程中在 PySide(或 PyQt)中使用 QProgressBar 實現 QThread

[英]Implement QThread with QProgressBar in PySide (or PyQt) during calculation

我想知道如何實現QProgressBar,它顯示了主線程中的計算進度。

請參考以下代碼。

import sys
from PySide2.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QProgressBar
from PySide2.QtCore import QThread

class BarThread(QThread):

    # Progress Bar UI Definition
    def __init__(self):
        QThread.__init__(self)
        self.window = QWidget()
        self.pgsb = QProgressBar()
        self.lay = QVBoxLayout()
        self.lay.addWidget(self.pgsb)
        self.window.setLayout(self.lay)
        self.isRun = False

    # Thread Function Definition
    def run(self):
        self.window.show()
        while self.isRun:
            self.pgsb.setValue(self.percent)
            print(self.percent)
            if self.percent == 100:
                self.isRun = False


class Tool(QWidget):

    # Main UI Definition
    def __init__(self):
        windowWidth = 300
        windowHeight = 300
        QWidget.__init__(self)
        self.setWindowTitle("Example")
        self.resize(windowWidth, windowHeight)
        self.bt = QPushButton('Numbering')
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.bt)
        self.setLayout(self.layout)

    # Main Function Link Definition
        self.bt.clicked.connect(self.numbering)

    # Main Function Definition
    def numbering(self):
        bth = BarThread()
        bth.start()
        bth.isRun = True
        for x in range(0,100000):
            bth.percent = x/1000
            print(x)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Tool()
    widget.show()
    sys.exit(app.exec_())

您可以直接復制並粘貼到您的 Python IDE 上。

(它需要 PySide2。它可以在您的提示中使用“pip install pyside2”進行安裝)。

此代碼執行簡單編號,但是,這不顯示編號進度。

我怎么解決這個問題? 先感謝您。

PS 我正在使用帶有 PyCharm 的 Windows 10。

您至少有以下錯誤:

  • 您不得從另一個線程修改 GUI,在您的情況下,run 方法在另一個線程中執行,但您嘗試修改 QProgressBar 的值,此外還顯示不允許的小部件。 如果要使用輔助線程中執行中提供的信息修改 GUI,則必須通過信號來完成,因為它們是線程安全的

  • for 循環是阻塞任務,因此它必須在另一個線程中執行。

綜上所述,解決方法是:

import sys
from PySide2.QtWidgets import (
    QApplication,
    QWidget,
    QPushButton,
    QVBoxLayout,
    QProgressBar,
)
from PySide2.QtCore import QThread, Signal


class ProgressWidget(QWidget):
    def __init__(self, parent=None):
        super(ProgressWidget, self).__init__(parent)
        self.pgsb = QProgressBar()

        lay = QVBoxLayout(self)
        lay.addWidget(self.pgsb)


class BarThread(QThread):
    progressChanged = Signal(int)

    def run(self):
        percent = 0
        for x in range(0, 100000):
            percent = x / 100
            self.progressChanged.emit(percent)


class Tool(QWidget):
    """Main UI Definition"""

    def __init__(self, parent=None):
        super(Tool, self).__init__(parent)
        self.setWindowTitle("Example")
        self.resize(300, 300)
        self.bt = QPushButton("Numbering")

        layout = QVBoxLayout(self)
        layout.addWidget(self.bt)

        # Main Function Link Definition
        self.bt.clicked.connect(self.numbering)

        self.bar_thread = BarThread(self)
        self.progress_widget = ProgressWidget()

        self.bar_thread.progressChanged.connect(self.progress_widget.pgsb.setValue)

    # Main Function Definition
    def numbering(self):
        self.bar_thread.start()
        self.progress_widget.show()


    def closeEvent(self, event):
        super(Tool, self).closeEvent(event)
        self.bar_thread.quit()
        self.bar_thread.wait()


if __name__ == "__main__":
    app = QApplication(sys.argv)
    widget = Tool()
    widget.show()
    sys.exit(app.exec_())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM