1. 多線程計算器
''' start():啟動線程 wait():阻止線程,直到滿足如下條件之一 (1)與此QThread對象關聯的線程已完成執行(即從run返回時),如果線程完成執行,此函數返回True,如果線程尚未啟動,也返回True (2)等待時間的單位是毫秒,如果時間是ULONG_MAX(默認值·),則等待,永遠不會超時(線程必須從run返回),如果等待超時,此函數將會返回False sleep():強制當前線程睡眠多少秒 QThread類中的常用信號 started:在開始執行run函數之前,從相關線程發射此信號 finished:當程序完成業務邏輯時,從相關線程發射此信號 ''' import sys from PyQt5.QtCore import * from PyQt5.QtWidgets import * sec = 0 class WorkThread(QThread): # 創建多個任務可以建多個 WorkThread(QThread) 后面啟動 timer = pyqtSignal(str) # 每隔1秒發送一次信號 str:可以傳遞參數 end = pyqtSignal(str) # 計數完成后發送一次信號 def run(self): while True: self.sleep(1) # 休眠1秒 if sec == 5: self.end.emit(str(sec)) # 發送end信號 str:可以傳遞參數 break self.timer.emit(str(sec)) # 發送timer信號 str:可以傳遞參數 class Counter(QWidget): def __init__(self, parent=None): super(Counter, self).__init__(parent) self.setWindowTitle("使用線程類(QThread)編寫計數器") self.resize(300, 120) layout = QVBoxLayout() self.lcdNumber = QLCDNumber() layout.addWidget(self.lcdNumber) button = QPushButton('開始計數') layout.addWidget(button) self.workThread = WorkThread() self.workThread.timer.connect(self.countTime) self.workThread.end.connect(self.end) button.clicked.connect(self.work) self.setLayout(layout) def countTime(self, secs): global sec sec += 1 print(secs) self.lcdNumber.display(sec) def end(self, secs): print(secs) QMessageBox.information(self, '消息', '計數結束', QMessageBox.Ok) def work(self): self.workThread.start() # 多個任務可以創建多self.workThread.start() if __name__ == "__main__": app = QApplication(sys.argv) form = Counter() form.show() sys.exit(app.exec_())
2. 定時任務
''' 動態顯示當前時間 QTimer # 定時器 QThread # 多線程 多線程:用於同時完成多個任務 ''' import sys from PyQt5.QtCore import QTimer, QDateTime from PyQt5.QtWidgets import QWidget, QPushButton, QApplication, QGridLayout, QLabel class ShowTime(QWidget): def __init__(self, parent=None): super(ShowTime, self).__init__(parent) self.setWindowTitle("動態顯示當前時間") self.label = QLabel('顯示當前時間') self.startBtn = QPushButton('開始') self.endBtn = QPushButton('結束') layout = QGridLayout() self.timer = QTimer() self.timer.timeout.connect(self.showTime) layout.addWidget(self.label, 0, 0, 1, 2) layout.addWidget(self.startBtn, 1, 0) layout.addWidget(self.endBtn, 1, 1) self.startBtn.clicked.connect(self.startTimer) self.endBtn.clicked.connect(self.endTimer) self.setLayout(layout) def showTime(self): time = QDateTime.currentDateTime() timeDisplay = time.toString("yyyy-MM-dd hh:mm:ss dddd") self.label.setText(timeDisplay) def startTimer(self): self.timer.start(1000) self.startBtn.setEnabled(False) self.endBtn.setEnabled(True) def endTimer(self): self.timer.stop() self.startBtn.setEnabled(True) self.endBtn.setEnabled(False) if __name__ == "__main__": app = QApplication(sys.argv) form = ShowTime() form.show() sys.exit(app.exec_())