pyqt多線程QThread


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

  


免責聲明!

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



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