多線程
一般情況單線程就可以很好的完成任務,但是對於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_())