【PyQt5】PyQt5 多執行緒 QThread 實現(轉載)

rockrabbit發表於2019-10-30

簡介

QThread類提供了一種獨立於平臺的執行緒管理方法。

QThread物件管理程式中的一個控制執行緒。在run()中開始執行QThreads。預設情況下,run()通過呼叫exec()啟動事件迴圈,並線上程中執行Qt事件迴圈。

建立一個新執行緒

class Thread(QThread):
    def __init__(self):
        super().__init__()
    def run(self):
        # 執行緒相關程式碼
        pass
# 建立一個新的執行緒
thread = Thread()
thread.start()

在使用執行緒時可以直接得到Thread例項,呼叫其start()函式即可啟動執行緒,執行緒啟動後,會呼叫其實現的run方法,該方法就是執行緒的執行函式,當run()退出之後執行緒基本就結束了。

QThread中常用的方法

【PyQt5】PyQt5 多執行緒 QThread 實現

例子實現

下面的例子通過在QThread中定義兩個自定義訊號實現時間的變化和動態為QListWidget新增控制元件

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
Created on 2019年1月16日
@author: yiluo
@site: https://github.com/bingshilei
@email: 786129166@qq.com
@file: QThreadDemo2
@description: 使用多執行緒動態新增控制元件
"""
import time

from PyQt5.QtCore import QThread, pyqtSignal, QDateTime
from PyQt5.QtWidgets import QWidget, QLineEdit, QListWidget, QPushButton,\
    QVBoxLayout, QLabel

'''
宣告執行緒類
'''

class addItemThread(QThread):
    add_item = pyqtSignal(str)
    show_time = pyqtSignal(str)

    '''
            新增控制元件
    '''
    def __init__(self,*args, **kwargs):
        super(addItemThread, self).__init__(*args, **kwargs)
        self.num = 0

    def run(self, *args, **kwargs):
        while True:
            file_str = 'File index{0}'.format(self.num,*args, **kwargs)
            self.num +=1

            #傳送新增訊號
            self.add_item.emit(file_str)

            date = QDateTime.currentDateTime()
            currtime = date.toString('yyyy-MM-dd hh:mm:ss')
            print(currtime)
            self.show_time.emit(str(currtime))

            time.sleep(1)

class Window(QWidget):

    def __init__(self, *args, **kwargs):
        super(Window, self).__init__(*args, **kwargs)
        self.setWindowTitle('多執行緒動態新增控制元件')
        # x,y,w,h
        self.setGeometry(800, 100, 500, 750)
        #建立QListWidget控制元件
        self.listWidget = QListWidget()
        #建立按鈕控制元件
        self.btn = QPushButton('開始',self)
        self.lb = QLabel('顯示時間',self)
        #建立佈局控制元件
        self.vlayout = QVBoxLayout()
        #將按鈕和列表控制元件新增到佈局
        self.vlayout.addWidget(self.btn)
        self.vlayout.addWidget(self.lb)
        self.vlayout.addWidget(self.listWidget)
        #設定窗體的佈局
        self.setLayout(self.vlayout)

        #繫結按鈕槽函式
        self.btn.clicked.connect(self.startThread)

        #宣告執行緒例項
        self.additemthread = addItemThread()

        #繫結增加控制元件函式
        self.additemthread.add_item.connect(self.addItem)

        #繫結顯示時間函式

        self.additemthread.show_time.connect(self.showTime)

    '''
    @description:按鈕開始,啟動執行緒
    '''
    def startThread(self):
        #按鈕不可用
        self.btn.setEnabled(False)
        #啟動執行緒
        self.additemthread.start()

    '''
    @description:為listwidget增加項
    @param:項的值 
    '''
    def addItem(self,file_str):
        self.listWidget.addItem(file_str)

    '''
    @description:顯示時間
    @param:項的值 
    '''
    def showTime(self,time):
        self.lb.setText(time)

if __name__ == '__main__':
    import sys
    from PyQt5.QtWidgets import QApplication
    app = QApplication(sys.argv)
    w = Window()
    w.show()
    sys.exit(app.exec_())

執行結果

點選開始按鈕,時間會進行變化,且在下方為QListWidget不斷增加項

【PyQt5】PyQt5 多執行緒 QThread 實現(轉載)

【PyQt5】PyQt5 多執行緒 QThread 實現(轉載)

以上,就是自定義訊號和QThread的運用。

謝謝您寶貴時間觀看。

作者:賣火柴的小小噴泉

連結:https://www.jianshu.com/p/18d7b119edcc

來源:簡書

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

相關文章