告别阻塞!实例讲解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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索