Python PyQt5 开启线程防止界面卡死闪退问题解决

 更新时间:2023年06月21日 14:41:14   投稿:mrr  
这篇文章主要介绍了Python PyQt5 开启线程避免界面卡死闪退,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Python PyQt5 的界面是主线程执行的,如果主线程执行了耗时操作,会导致主线程阻塞使得界面卡死闪退。所以,对于一个耗时操作需要开启一个线程执行。

首先导入几个包:

from PyQt5 import QtCore
from PyQt5.QtCore import *

创建一个线程类:

class ListDevicesThread(QtCore.QThread):
    signal = pyqtSignal(dict, name='list_devices')
    def run(self):
        while True:
            devices_list = apis.list_devices()
            self.signal.emit(devices_list)
            time.sleep(5)

这个线程每隔 5 秒执行一次获取数据的操作。并通过 emit 把数据发送到主界面中。所以,主界面要获取这个值就需要通过回调函数接收:

class Window(QWidget, Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        # 获取设备列表
        self.list_shadow_thread = ListDevicesThread()
        self.list_shadow_thread.signal.connect(self.after_list_devices)
        self.list_shadow_thread.start()
  • 创建 ListDevicesThread 线程对象,将对象设置到类成员变量中(如果不设置,或者设置重复的线程变量名,要么让线程无法执行,要么主界面卡死,不能运行程序)。
  • self.list_shadow_thread.signal.connect(self.after_list_devices) 这个代码的意思是,得到线程对象的信号对象,连接到主界面的 after_list_devices 函数,这个函数就是回调函数,可以接收到 emit 函数发送过来的数据,数据类型在线程中定义(可以是 str、dict 等合法的 py 类型)。
  • 第三步就是开启线程并执行。

在线程获取到一次数据之后,执行下面的回调函数,回调函数收到数据 data,可以进行一些不需要耗时的操作,如果之后还有耗时的操作建议一次性在线程执行完成再到这个回调函数中来:

def after_list_devices(self, data):
        row = 0
        self.tableWidget.setRowCount(data['page']['count'])
        for item in data['devices']:
            self.setTableItem(row, 0, item['device_id'])
            self.setTableItem(row, 1, item['device_name'])
            self.setTableItem(row, 2, item['product_name'])
            self.setTableItem(row, 3, item['status'])
            self.setTableItem(row, 4, item['description'])
            row += 1

到目前为止,上面都是线程执行完成之后获取数据发送给主线程(主界面),是 线程->主线程 的过程。有时候,主线程的一些输入框里面的值需要发送给线程,让线程得到输入框内的值再执行下一步操作。这个是 主线程->线程->主线程 的过程。

首先,在线程中创建一个设置值的函数,如 set_xxx 这样的格式:

class QueryDeviceThread(QtCore.QThread):
    signal = pyqtSignal(dict, name='query_device')
    device_id = ''
    def set_device_id(self, device_id):
        self.device_id = device_id
    def run(self):
        device = apis.query_device(self.device_id)
        self.signal.emit(device)

device_id 是线程的类成员变量,通过 set_device_id 函数给 device_id 设置新的值。在 run 函数执行的时候,获取到 device_id 值,这个值要在主界面开启线程之前设置好。

点击界面的按钮之后触发下面的函数,在开启线程之前,且线程对象创建之后,设置线程的类成员变量。

def query_device(self):
    self.query_device_thread = QueryDeviceThread()
    self.query_device_thread.set_device_id(self.input_query_device_id.text())
    self.query_device_thread.signal.connect(self.after_query_device)
    self.query_device_thread.start()

到此这篇关于Python PyQt5 开启线程避免界面卡死闪退的文章就介绍到这了,更多相关Python PyQt5 开启线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python使用selenium + headless chrome获取网页内容的方法示例

    Python使用selenium + headless chrome获取网页内容的方法示例

    这篇文章主要介绍了Python使用selenium + headless chrome获取网页内容的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python在for循环里处理大数据的推荐方法实例

    Python在for循环里处理大数据的推荐方法实例

    这篇文章主要介绍了Python在for循环里处理大数据的推荐方法实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python实现ROA算子边缘检测算法

    python实现ROA算子边缘检测算法

    这篇文章主要为大家详细介绍了python实现ROA算子边缘检测算法,以光学图像为例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Python机器学习应用之朴素贝叶斯篇

    Python机器学习应用之朴素贝叶斯篇

    朴素贝叶斯模型是一组非常简单快速的分类算法,通常适用于维度非常高的数据集。因为运行速度快,而且可调参数少,因此非常适合为分类问题提供快速粗糙的基本方案
    2022-01-01
  • Python文件操作,open读写文件,追加文本内容实例

    Python文件操作,open读写文件,追加文本内容实例

    本篇文章主要介绍了Python文件操作,open读写文件,追加文本内容,具有一定的参考价值,有需要的可以了解一下。
    2016-12-12
  • 跟老齐学Python之永远强大的函数

    跟老齐学Python之永远强大的函数

    Python程序中的语句都会组织成函数的形式。通俗地说,函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字,这样,我们就可以通过函数名在程序的不同地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句。
    2014-09-09
  • Python绘制数据图表的超详细教程

    Python绘制数据图表的超详细教程

    画一个吸引人注意的图表相当重要,当你探索一个数据集,需要画图表,图表看起来令人愉悦是件很高兴的事,下面这篇文章主要给大家介绍了关于Python绘制数据图表的超详细教程,需要的朋友可以参考下
    2022-11-11
  • Python list运算操作代码实例解析

    Python list运算操作代码实例解析

    这篇文章主要介绍了Python list运算操作代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Django后端接收嵌套Json数据及解析详解

    Django后端接收嵌套Json数据及解析详解

    这篇文章主要介绍了Django后端接收嵌套Json数据及解析详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • Pygame实战练习之炸弹人学院游戏

    Pygame实战练习之炸弹人学院游戏

    炸弹人学院想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用python写一个简单的炸弹人学院小游戏的相关资料,需要的朋友可以参考下
    2021-09-09

最新评论