告別阻塞!實例講解PyQt5多線程QThread的運用

點擊關注州的先生

編程應用、實戰教程,不容錯過python


PS:本文來自於小夥伴的投稿,由伊洛首發於簡書。git


QThread類提供了一種獨立於平臺的線程管理方法。github

QThread對象管理程序中的一個控制線程,在run()中開始執行QThreads。默認狀況下,run()經過調用exec()啓動事件循環,並在線程中運行Qt事件循環。
編程

  
    
  
  
   
   
            
   
   
  1. 微信


  2. 多線程

  3. app


  4. 函數

  5. 佈局

  6. flex


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

在使用線程時能夠直接獲得Thread實例,調用其start()函數便可啓動線程。

線程啓動後,會調用其實現的run方法,該方法就是線程的執行函數,當run()退出以後線程基本就結束了。 QThread中經常使用的方法以下圖所示:

QThread經常使用方法.png

例子實現 

下面的例子經過在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 timefrom PyQt5.QtCore import QThread, pyqtSignal, QDateTimefrom 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不斷增長項

運行結果1.png

運行結果2.png

以上,就是自定義信號和QThread的運用。 寫個留言咱們來討論討論~


萬水千山老是情,點個「好看」行不行↓↓↓

本文分享自微信公衆號 - 州的先生(zmister2016)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索