PyQt5学习笔记--多线程处理、数据交互

news2025/7/10 9:57:28

目录

1--引入多线程的原因

2--PyQt多线程的基本知识

3--多线程登录程序的实例

4--参考


1--引入多线程的原因

① 如果Qt只采用单线程任务的方式,当遇到数据处理慢的情形时,会出现GUI卡死的情况。

② 使用下述例子展示单线程任务的缺陷:

③ 代码:

import sys
import time

from PyQt5 import uic
from PyQt5.QtCore import QThread
from PyQt5.QtWidgets import QWidget, QApplication


class MyThread(QThread):
    def __init__(self):
        super().__init__()

    def run(self):
        for i in range(10):
            print("是MyThread线程中执行....%d" % (i + 1))
            time.sleep(1)

class MyWin(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()
    def init_ui(self):
        self.ui = uic.loadUi("./thread.ui")

        # 从ui文件中加载控件
        line_edit = self.ui.lineEdit
        btn1 = self.ui.pushButton
        btn2 = self.ui.pushButton_2

        # 控件绑定槽函数
        btn1.clicked.connect(self.click_1)
        btn2.clicked.connect(self.click_2)
        
    def click_1(self):
        for i in range(10):
            print("是UI线程中执行....%d" % (i + 1))
            time.sleep(1)

    def click_2(self):
        self.my_thread = MyThread() # 创建线程
        self.my_thread.start() # 开始线程


if __name__ == "__main__":
    app = QApplication(sys.argv)
    myshow = MyWin()
    myshow.ui.show()
    sys.exit(app.exec_())

④ 结果展示:

当点击第一个button时,GUI会出现卡顿无法显示输出的问题;当点击第二个button时,GUI可以正常工作,输入框可以正常显示输入的内容。

2--PyQt多线程的基本知识

① 通过继承父类QThread可以新建子线程;

② 线程之间可以通过信号进行交互,并通过其槽函数执行对应的功能;

③ 常用函数:(后面会专门写一篇笔记,其内容是如何在线程之间通过信号传递opencv图片、numpy数组等数据格式)

signal = pyqtSignal(str); # 创建信号

signal.emit(json); # 发送信号

json = json.dumps(data); # 将数据序列化封装

data = json.loads(json); # 将数据还原

3--多线程登录程序的实例

① 基于Qt Designer设计 ui 文件:

 ② 代码:

import json
import sys
import time

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5 import uic

# 子线程
class LoginThread(QThread):
    # 创建信号 接受字符串(这里用于主线程向子线程传递信息)
    start_login_signal = pyqtSignal(str) 

    def __init__(self, signal):
        super().__init__()
        # 信号绑定槽函数
        self.start_login_signal.connect(self.login_by_requests)

        self.login_complete_signal = signal

    def login_by_requests(self, user_password_json):
        # 将json字符串转换
        user_password_dict = json.loads(user_password_json)
        user_name = user_password_dict.get("user_name")
        password = user_password_dict.get("password")
        print(user_name, password)
        
        # 比对登录信息,返回登录状态(可自由扩充)
        if user_name == "liujinfu" and password == "liujinfu":
            self.login_complete_signal.emit(json.dumps(True)) # 返回True
        else:
            self.login_complete_signal.emit(json.dumps(False)) # 返回False

    def run(self):
        while True: # 让子线程一直运行,等待主线程(ui线程)下发的任务
            print("子线程正在等待执行....")
            time.sleep(2)

# 主线程
class MyWindow(QWidget):
    # 创建信号(这里用于子线程向主线程返回信息)
    login_status_signal = pyqtSignal(str)  

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        self.ui = uic.loadUi("./login.ui")  # 加载由Qt Designer设计的ui文件

        self.user_name_qwidget = self.ui.lineEdit  # 用户名输入框
        self.password_qwidget = self.ui.lineEdit_2  # 密码输入框
        self.login_btn = self.ui.pushButton  # 登录按钮
        self.forget_btn = self.ui.pushButton_2  # 忘记密码按钮
        self.text_browser = self.ui.textBrowser  # 文本显示区域

        # 绑定槽函数
        self.login_btn.clicked.connect(self.login)

        self.login_thread = LoginThread(self.login_status_signal)  # 登录子线程
        self.login_thread.start() # 让子线程开始工作

        self.login_status_signal.connect(self.login_status)

    def login(self):
        # 实现登录函数
        self.user_name = self.user_name_qwidget.text()
        self.password = self.password_qwidget.text()
        # 发送信号,让子线程开始登录
        self.login_thread.start_login_signal.emit(json.dumps({"user_name": self.user_name, "password": self.password}))

    def login_status(self, status):
        # 根据登录状态打印信息(可自由扩充)
        if json.loads(status):
            self.text_browser.setText("Welcome %s !" % self.user_name)
            self.text_browser.repaint()
        else:
            self.text_browser.setText("User_name or password is not correct, please try again !")
            self.text_browser.repaint()

if __name__ == '__main__':
    app = QApplication(sys.argv)  # 创建对象

    w = MyWindow()
    # 展示窗口
    w.ui.show()

    # 程序进行循环等待状态
    app.exec_()

③ 结果展示:

注:后面会专门写一篇笔记,其内容是如何在线程之间通过信号传递opencv图片、numpy数组等数据格式

4--参考

PyQt5 快速入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/39090.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习之继承的本质(重要)

目录 目录 一、一个继承的代码案例 二、子类创建的内存布局 三、查找顺序 一、son.name的输出结果 二、son.age的输出结果 三、son.hobby的输出结果 一、一个继承的代码案例 package com.hspedu.entends_;/*** 讲解继承的本质*/ public class ExtendsTheory {public sta…

Spring Boot 项目的创建和简单使用

目录 1. 什么是 Spring Boot, Spring Boot 框架有什么优点 2. Spring Boot 项目的创建 2.1 在 IDEA 下安装 Spring Boot Helper 插件: 2.2 创建 Spring Boot 项目: 2.3 网页版创建 Spring Boot 项目 3. Spring Boot 通过路由映射到本地程序 1. 什么是 Spring Boot, Spring …

MFC编辑框控件属性和用法

目录 一、编辑框的属性 1.want return 2.Multiline 3.滚动条 4.添加完效果 二、初始化编辑框内容 三、复制与退出 四、edit control的值类型 五、思维拓展 一、编辑框的属性 默认情况下编辑框edit control 是可以横向无限输入的 1.want return 支持换行,…

dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

Private Execution on Blockchain

1.Alan Szepieniec: Ghost-Queen Chess——复杂金融合约 Alan Szepieniec为Neptune合伙人。 为何需关注decentralized Finance? 1)从学术角度来看:是 密码学 ∩\cap∩ 分布式系统 ∩\cap∩ 经济学 ∩\cap∩ …的集合。2)从工程…

基于蚁群算法的多配送中心的车辆调度问题的研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

BUUCTF Misc ningen1 小明的保险箱1 爱因斯坦1 easycap1

ningen1 下载文件 使用kali中的binwalk查看 binwalk xxx.jpg 分离文件 打开 压缩包加密了,爆破 爆破成功,密码:8368 得到flag flag{b025fc9ca797a67d2103bfbc407a6d5f} 小明的保险箱1 下载文件 用010 editor打开 可以看到图…

Java初识泛型

什么是泛型 泛型是jdk1.5引入的新语法,泛型就是适用于许多许多类型,就是对类型实现了参数化。实现一个类,类中包含一个数据成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值 class M…

linux-免费ssl证书

title: linux-免费ssl证书 categories: Linux tags: [linux, xshell] date: 2022-09-10 19:29:55 comments: false mathjax: true toc: true linux-免费ssl证书 前篇 33种免费获取SSL证书的方式 - https://zhuanlan.zhihu.com/p/174755007 HTTPS 证书文件格式转换 HTTPS证书文…

基于多目标粒子群优化算法的冷热电联供型综合能源系统运行优化附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

acm退役小记

本人大学是接近一本线的二本大学,目前能打的区域赛场基本打完了,桂林rank105和沈阳rank140是有两个区域赛铜。如果我是强校的话,也会说下只能拿废物铜耻辱退役 这里简单记下我的acm生涯 其实我一直觉得对于我们这种弱校,虽然打a…

delete删除后怎么恢复文件?四种方法进行找回

演示机型:技嘉 H310M HD22.0 系统版本:Windows 10 专业版 很多小伙伴在日常工作或生活中,喜欢通过delete键进行删除文件,虽然这种删除方式快捷方便,但是也容易出现误删的情况,那么用delete键删除的文件可以…

【语音识别】高斯混合模型(GMM)说话人识别【含Matlab源码 574期】

⛄一、高斯混合模型简介 GMM基本框架 类似的还有GMM-UBM(Universal background model)算法,其与GMM的区别在于:对L类整体样本训练一个大的GMM,而不像GMM对每一类训练一个GMM模型。SVM的话MFCC作为特征,每一帧作为一个样本&#…

golang的new和make

golang 变量定义的方式 可以通过 var变量名称变量类型 进行声明变量,当我们没有给它赋值的时候,它们的结果是变量类型的零值,例如: string 的零值是"",int 的零值是0,引用类型的零值是nil。 前面两种类型…

Android加载第三方so库

本篇文章使用的android studio版本是:Android Studio Bumblebee | 2021.1.1 Patch 2 上一篇文章:Android开发java调用C简单示例 演示了java调C,那么so文件能否复用到别的项目了? 这次我们尝试用上一篇文章生成的so库,调用里面的…

APK 签名 v1 v2 步骤

APK 签名 v1 v2 步骤 需要工具 **apksigner.jar jarsinger.exe keytool.exe zipalign.exe ** 1.生成 keystore keytool -genkey -v -keystore my.keystore -alias liuhan -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -dname "cnTest,ouTest,cCA" -validity …

【机器学习入门项目10例】(六):KMeans聚类

💥 项目专栏:【机器学习入门项目10例】 文章目录 一、KMeans聚类二、数据集介绍三、KMeans聚类算法介绍四、定义KMeans模型4.1 kmeans算法入口4.2 初始化簇4.3 计算DBI优化指标4.4 计算每个样本到簇中心的距离4.5 更新每个样本所属的簇分类4.6 更新每个簇的中心4.7 官方实现…

百行代码实现VLC简易视频播放器【详细环境配置过程+可执行源码注释完整】

文章目录❓什么是VLC🚀VLC 库的集成⭐VLC环境配置演示【win10系统vs2017win64】🍎VLC 库的基本使用🎂视频播放器实现⭐自定义函数Unicode2Utf8讲解🏠总结❓什么是VLC VLC 是 Video Lan Client 的缩写,原先是几个法国的…

学生HTML网页作业作品:HTML+CSS网站设计与实现【红色喜庆邀请函 3页】

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

朗道-西格尔零点猜想(the Landau-Siegel Zeros Conjecture)

1 简介 朗道-西格尔零点猜想(the Landau-Siegel Zeros Conjecture),是一个数学难题。 要理解朗道-西格尔零点猜想,首先需要理解黎曼猜想,进而需理解广义黎曼猜想,以及狄利克雷L函数。断言L函数没有异常零…