【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.mzph.cn/news/671084.shtml

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

相关文章

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前,对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后,引进了交叉引用流(cross-reference stream)对象,可以用它来存储对象的交叉引用信息,就像交叉引用表的功能一样。 采用交…

C遗漏知识(个人向)

之前C语言遗漏的一些。 数据在内存中的存储 原码、反码、补码 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码&…

Javascript入门学(基础)

软件篇 JS基础语法第一天 1.javascript介绍 1.1 js是什么 是什么 是一种运行在客户端(浏览器)的编程语言,实现人机交互效果,而html和css是标记性语言,并非编程语言有什么用 js的组成 htmlcssjs实现按钮点击功能 …

Vision Transfomer系列第一节---从0到1的源码实现

本专栏主要是深度学习/自动驾驶相关的源码实现,获取全套代码请参考 这里写目录标题 准备逐步源码实现数据集读取VIt模型搭建hand类别和位置编码类别编码位置编码 blocksheadVIT整体 Runner(参考mmlab)可视化 总结 准备 本博客完成Vision Transfomer(VIT)模型的搭建和flowers数…

股票K线简介

股票K线(K-Line)是用于表示股票价格走势的图形,主要由四个关键价格点组成:开盘价、收盘价、最高价和最低价。K线图广泛应用于股票市场技术分析中,它提供了丰富的信息,帮助分析师和投资者理解市场的行情走势…

一周学会Django5 Python Web开发-Django5介绍及安装

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计10条视频,包括:2024版 Django5 Python we…

算法练习-四数之和(思路+流程图+代码)

难度参考 难度:中等 分类:数组 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨在…

“过年买年货,花光了我的年终奖”

【潮汐商业评论/原创】 前脚刚进家门,后脚快递电话一个接着一个。 临近春节,Julia是提前批回家的年轻人,与Julia一同到家的还有她的年货。上至大小家电,下到坚果零食,短短几天快递就堆满了客厅。 吃的喝的还能理解&…

MySQL的优化

优化MySQL的几点: 从设计上优化 从查询上优化 从索引上优化 从存储上优化 1,SQL的执行频率 MySQL客户端连接成功后,通过show [session/global] status命令可以查看服务器状态信息。通过查看状态信息可以查看对当前数据库的主要操作类型…

【01】判断素数/质数(C语言)

目录 (1)素数特点:只能被1和本身整除 (2)代码如下: (3)运行结果如下 ​编辑 (4)函数引申 (1)素数特点:只能被1和本身…

数字图像处理(实践篇)四十三 OpenCV-Python 使用SURF算法检测图像上的特征点的实践

目录 一 SURF算法概述 1 积分图 2 SURF算法 3 SIFT与SURF 二 涉及的函数 三 实践 一 SURF算法概述

在容器中使用buildah构建镜像

简介 buildah是一个构建OCI标准镜像的工具,可以用来替代docker build 在常见的linux发行版中可直接通过包管理工具安装使用 # centos yum install buildah# ubuntu/debian apt install buildah# alpine apk add buildah其他发行版安装方法详见 github&#xff0c…

Django通过Json配置文件分配多个定时任务

def load_config():with open("rule.json", rb)as f:config json.load(f)return configdef job(task_name, config, time_interval):# ... 通过task_name判断进行操作if task_name get_data_times:passdef main():config load_config()for task_name, task_value…

C++——stack与queue与容器适配器

1.stack和queue的使用 1.1stack的使用 栈这种数据结构我们应该挺熟了,先入后出,只有一个出口(出口靠栈顶近)嘛 stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以操作: empty&#xff1…

专业知识库:中小型企业必备的高效工具

在如今这个信息爆炸的时代,知识管理已经成为了企业运营的重要环节。特别是对于中小型企业来说,如何有效地管理公司内部的知识,提高工作效率,已经成为了一个亟待解决的问题。在这篇文章中,我将向大家介绍一种能够帮助企…

Python轴承故障诊断入门教学

目录 往期精彩内容: 1 工作室实验平台介绍 2 轴承故障诊断教程—数据集 3 轴承故障诊断教程—算法模型 3.1 振动分析方法 3.2 频域特征提取 3.3 时域特征提取 3.4 模型基础的机器学习方法 3.5 深度学习方法 3.6 时频域融合方法 3.7 信号重构方法 3.8 基…

Linux-----文本三剑客补充~

一、模糊匹配 模糊匹配用 ~ 表示包含,!~表示不包含 1、匹配含有root的列 [rootlocalhost ~]#awk -F: /root/ /etc/passwd root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [rootlocalhost ~]#awk -F: $1~ /root/ /etc/passw…

知名开发工具RubyMine全新发布v2023.3——支持AI Assistant

RubyMine 是一个为Ruby 和 Rails开发者准备的 IDE,其带有所有开发者必须的功能,并将之紧密集成于便捷的开发环境中。 RubyMine v2023.3正式版下载 新版本改进AI Assistant支持、Rails应用程序和引擎的自定义路径、对Rails 7.1严格locals的代码洞察、RB…

人胰岛素样生长因子-1 ELISA试剂盒IGF-1 (human), ELISA kit

高灵敏ELISA试剂盒,4小时内可得结果,最低可检测34.2 pg/ml的IGF-1 胰岛素样生长因子-1(IGF-1)是一种多肽激素,在结构上与胰岛素相似。它参与调节中枢和周围神经系统的神经元生长和发育。IGF-1是一种有效的神经元凋亡抑…

【Zookeeper】what is Zookeeper?

官网地址:https://zookeeper.apache.org/https://zookeeper.apache.org/ 以下来自官网的介绍 ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. A…