【PyQt】05-多线程

文章目录

  • 前言
  • 一、什么是单线程、多线程
  • 二、代码现象
    • 示例
    • 多线程代码
    • 运行结果
  • 总结


前言

文章开始还是解释一下,这是跟着王铭东老师学习的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、什么是单线程、多线程

单线程
在Python中,单线程是指在程序中只有一个执行线程,它按照顺序逐行执行代码。这意味着每次只能执行一个任务或操作,直到完成后才能执行下一个任务。
单线程模型适用于简单的程序或任务,其中没有太多需要同时处理的操作。在单线程中,代码的执行是以同步的方式进行的,也就是说,每个操作都必须等待前一个操作完成后才能执行。
虽然单线程简单易于理解和实现,但也有一些缺点。当任务变得复杂或需要处理大量计算时,单线程的执行速度可能会变慢。此外,如果一个任务遇到了阻塞(如等待用户输入或网络请求),那么整个程序都将被阻塞,无法执行其他任务。
多线程
是指在程序中同时运行多个线程,每个线程负责执行一个特定的任务或操作。与单线程相比,多线程可以同时处理多个任务,从而提高程序的并发性和响应性能。

在Python中,可以使用内置的threading模块来实现多线程。通过创建Thread类的实例,并将要执行的任务作为线程的目标函数传递给它,可以创建多个并行运行的线程。

二、代码现象

示例

视频中老师给了一个例子,就是在登入中载入延时,然后就动不了。卡在延时那里,于是延伸出多线程的现象来。他给的代码是下面这个。

import sys
import timefrom PyQt5.QtWidgets import *
from PyQt5 import uicclass MyWindow(QWidget):def __init__(self):super().__init__()self.init_ui()def init_ui(self):self.ui = uic.loadUi("./login.ui")# print(self.ui.__dict__)  # 查看ui文件中有哪些控件# 提取要操作的控件self.user_name_qwidget = self.ui.lineEdit  # 用户名输入框self.password_qwidget = self.ui.lineEdit_2  # 密码输入框self.login_btn = self.ui.pushButton  # 登录按钮self.forget_password_btn = self.ui.pushButton_2  # 忘记密码按钮self.textBrowser = self.ui.textBrowser  # 文本显示区域# 绑定信号与槽函数self.login_btn.clicked.connect(self.login)def login(self):"""登录按钮的槽函数"""user_name = self.user_name_qwidget.text()password = self.password_qwidget.text()for i in range(10):print("正在登录服务器....%d" % (i + 1))time.sleep(1)if user_name == "admin" and password == "123456":self.textBrowser.setText("欢迎%s" % user_name)self.textBrowser.repaint()else:self.textBrowser.setText("用户名或密码错误....请重试")self.textBrowser.repaint()if __name__ == '__main__':app = QApplication(sys.argv)w = MyWindow()# 展示窗口w.ui.show()app.exec()

在这里插入图片描述
会使得程序卡住。我就不执行这个了,没啥意义。

多线程代码

'''
#Author :susocool
#Creattime:2024/2/4
#FileName:014-多线程
#Description: 理解多线程
'''
import sys
import timefrom PyQt5 import uic
from PyQt5.Qt import QApplication, QWidget, QThreadclass MyThread(QThread):    # 这里需要注意括号里是QThread,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-1.ui")# 从ui文件中加载控件lineedit = self.ui.lineEditbtn1 = self.ui.pushButtonbtn2 = self.ui.pushButton_2# 给2个按钮绑定槽函数btn1.clicked.connect(self.click_1)  # 绑定槽函数btn2.clicked.connect(self.click_2)  # 绑定槽函数# 按钮1 直接延时到10def click_1(self):for i in range(10):print("是UI线程中执行....%d" % (i + 1))time.sleep(1)# 按钮2 创建线程def click_2(self):self.my_thread = MyThread()  # 创建线程self.my_thread.start()  # 开始线程if __name__ == "__main__":app = QApplication(sys.argv)myshow = MyWin()myshow.ui.show()app.exec()

一些解释
关于Python中的self,我一直不明白。

在 Python 中,self 是一个特殊的参数,用于表示类的实例对象自身。它是一个约定俗成的命名,大部分情况下都使用 self,但在语法上可以使用任意名称。
当定义一个类的方法时,第一个参数通常被命名为 self(或其他约定俗成的名称,比如 this),用于引用该类的实例对象。通过 self,我们可以在类的方法内部访问实例的属性、调用实例的方法,以及操作实例所拥有的其他成员。
这个 self 参数并不需要在调用方法时手动传递,Python 会自动将方法调用者的实例赋值给 self。

def run(self):
self 是指当前线程实例的引用,QThread 类会自动传递线程实例给 self,并自动调用 run 方法执行我们编写的代码。当线程被启动时,就会自动调用 run 方法中的代码。

运行结果

当点击按钮1
在这里插入图片描述
在这里插入图片描述
当点击按钮2
在这里插入图片描述


总结

  • 介绍了PyQt中的多线程

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10没有调节亮度选项怎么办?

最近新装了win10,装机后”设置“-”显示“里面没有可以调节亮度的地方,这里记录一下解决方案。 解决方案 按WinX键,选择设备管理器,点击”显示适配器“,我这里默认是只有”Microsoft 基本显示适配器“,没有…

图解GPT2

GPT是一种Transformer Decoder架构,Decoder通过自回归方式生成下一个词,所以擅长文本生成任务。 本文将图解GPT2,本系列还有图解Tokenization,Word2Vec,Transformer,Bert。 这篇文章主要来自下面这篇博客。…

3.0 Zookeeper linux 服务端集群搭建步骤

本章节将示范三台 zookeeper 服务端集群搭建步骤。 所需准备工作,创建三台虚拟机环境并安装好 java 开发工具包 JDK,可以使用 VM 或者 vagrantvirtualbox 搭建 centos/ubuntu 环境,本案例基于宿主机 windows10 系统同时使用 vagrantvirtualb…

GO语言集成开发 JetBrains GoLand 2023 中文

JetBrains GoLand 2023是一款专为Go语言开发者打造的集成开发环境(IDE)。它基于IntelliJ IDEA平台,提供了丰富的功能和工具,旨在提高开发效率和质量。GoLand 2023具备强大的Go语言支持,包括语法高亮、自动补全、代码提…

VPP学习-VPP初始化流程

概念 VPP作为一个开源的、高性能的用户态网络协议栈,以进程的形式运行于Linux或(类unix)系统下,即VPP实际是一个用户进程,VPP启动后可通过"ps -ef | grep vpp"命令查看。 VPP启动 用户态进程启动都有一个ma…

(三)elasticsearch 源码之启动流程分析

https://www.cnblogs.com/darcy-yuan/p/17007635.html 1.前面我们在《(一)elasticsearch 编译和启动》和 《(二)elasticsearch 源码目录 》简单了解下es(elasticsearch,下同),现在我…

MySQL数据库④_表的约束(主键_自增长_唯一键_外键等)

目录 1. 约束概念和常见的约束 2. 空属性null/not null 2. 默认值default 3. 列描述comment 4. 自动填充zerofill 5. 主键primary key ​​​​​​​5.1 主键 5.2 复合主键​​​​​​​​​​​​​​ 6. 自增长auto_increment 7. 唯一键unique key 8. 外键forei…

「刷题」二叉树的题刷不动?快进来拓展解题思路!

🎇个人主页:Ice_Sugar_7 🎇所属专栏:数据结构刷题 🎇欢迎点赞收藏加关注哦! 题单 🍉对称二叉树🍉层序遍历二叉树🍉由前序、中序遍历构造二叉树 🍉对称二叉树 …

three.js 向量方向(归一化.normalize)

效果&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div><p><el-button type"primary…

代码随想录算法训练营29期|day42 任务以及具体任务

第九章 动态规划part04 01背包问题&#xff0c;你该了解这些&#xff01; 动态规划&#xff1a;01背包理论基础 本题力扣上没有原题&#xff0c;大家可以去卡码网第46题 (opens new window)去练习&#xff0c;题意是一样的。 #算法公开课 《代码随想录》算法视频公开课 (opens…

C语言数组练习以及场景练习题

写了那么久的知识点梳理&#xff0c;今天来写点自己觉得不错的练习题来分享&#xff0c;顺便来巩固自己的知识点&#xff0c;和加强题型的解决方法的记忆。今天给大家带来的有数组的找数字题目&#xff0c;以及场景找凶手的题目&#xff0c;下面让我们来看看今天的第一道题目。…

Linux进程信号处理:深入理解与应用(3)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;its 6pm but I miss u already.—bbbluelee 0:01━━━━━━️&#x1f49f;──────── 3:18 &#x1f504; ◀️…