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_())