PyQt5多線程和定時器


多線程

一般情況單線程就可以很好的完成任務,但是對於GUI程序來說,單線程就不能完全滿足需求。如果有耗時流程,在單線程的情況下,界面操作就會卡死,直到耗時操作完成,才會響應界面操作。為了解決這個問題,PyQt提供了兩個異步操作的對象:QThread和QTimer。

QTimer

功能:定時器,固定時間觸發消息

接口:

方法 描述
start(milliseconds) 啟動定時器,單位是毫秒
stop() 停止定時器

QThread

功能:開辟一個線程,和主線程並行執行

接口:

方法 描述
start() 啟動線程
sleep(seconds) 線程休眠,單位秒

需求:分別使用QThread和QTimer

import sys
from PyQt5.QtCore import QTimer
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar

class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        self.currentValue = 0

        self.progessBar = QProgressBar(self)
        self.progessBar.resize(200, 50)
        self.progessBar.move(20, 20)
        self.progessBar.setValue(self.currentValue)

        # 定義一個定時器並啟動定時器
        self.time = QTimer()
        self.time.timeout.connect(self.upgradeProgress)
        self.time.start(200)

    def upgradeProgress(self):
        self.currentValue = (self.currentValue + 1) % 101
        self.progessBar.setValue(self.currentValue)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.resize(500, 300)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    sys.exit(app.exec_())
import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QWidget, QProgressBar

class MyWorker(QThread):
    timeout = pyqtSignal()

    def __init__(self):
        super(MyWorker, self).__init__()

    def run(self):
        while True:
            self.timeout.emit()
            self.sleep(1)

class MyWidget(QWidget):
    def __init__(self):
        super(MyWidget, self).__init__()
        self.currentValue = 0

        self.progessBar = QProgressBar(self)
        self.progessBar.resize(200, 50)
        self.progessBar.move(20, 20)
        self.progessBar.setValue(self.currentValue)

        self.worker = MyWorker()
        self.worker.timeout.connect(self.upgradeProgress)
        self.worker.start()

    def upgradeProgress(self):
        self.currentValue = (self.currentValue + 1) % 101
        self.progessBar.setValue(self.currentValue)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MyWidget()
    w.resize(500, 300)
    w.move(300, 300)
    w.setWindowTitle('Simple')
    w.show()
    sys.exit(app.exec_())

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM