6. PyQt5 中的多线程的使用(上)
专栏地址 ʅ(‾◡◝)ʃ
这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用
1. 为什么要用多线程
先看下面这一个示例代码
6.1
from form import Ui_Form
from PyQt5.QtWidgets import *
import sys
import time
class MyWin(QWidget,Ui_Form):
"""docstring for Mywine"""
def __init__(self):
super(MyWin, self).__init__()
self.setupUi(self)
def test(self): # 这里test就是槽函数, 当点击按钮时执行 test 函数中的内容, 注意有一个参数为 self
for i in range(10):
self.pushButton.setText(str(i))
time.sleep(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
mywin = MyWin() # 实例化一个窗口小部件
mywin.setWindowTitle('Hello world!') # 设置窗口标题
mywin.show() #显示窗口
sys.exit(app.exec())
代码很简单, 就是点击按钮后, 将按钮的内容设置为 0, 然后等待一秒后 再设置 为1, 如此循环, 一直设置到 9, 这个过程结束
但是在实际运行的过程中点击按钮后就没有反应了, 一直等待 10 秒后直接将按钮的内容设置为 9
这是因为图形化界面必须等待代码中的 test() 槽函数执行完毕后再更新图形话界面的内容, 所以直到 test() 函数执行完毕后 按钮的内容只会被设置为 9, 而没有中间的设置过程
当然在实际的软件开发的时候阻塞的时间可能会更长, 想象一下如果你制作一个下载器有一个进度条, 开始时进度还是0 ,过了很长时间突然件进度突然跑满了, 会让用户有一种软件卡住的错觉, 这个时候我们就需要使用 PyQt5 的多线程了
2. 怎么使用多线程
有 python 编程基础的人可能第一个想到的是 threading 这个库
但这里不是用到 threading , 而是 PyQt5 中的多线程类
示例代码:
6.2
from form import Ui_Form
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QThread, pyqtSignal
import sys
import time
class MyWin(QWidget,Ui_Form):
"""docstring for Mywine"""
def __init__(self):
super(MyWin, self).__init__()
self.setupUi(self)
self.mythread = MyThread() # 实例化自己建立的任务线程类
self.mythread.signal.connect(self.callback) #设置任务线程发射信号触发的函数
def test(self): # 这里test就是槽函数, 当点击按钮时执行 test 函数中的内容, 注意有一个参数为 self
self.mythread.start() # 启动任务线程
def callback(self,i): # 这里的 i 就是任务线程传回的数据
self.pushButton.setText(i)
class MyThread(QThread): # 建立一个任务线程类
signal = pyqtSignal(str) #设置触发信号传递的参数数据类型,这里是字符串
def __init__(self):
super(MyThread, self).__init__()
def run(self): # 在启动线程后任务从这个函数里面开始执行
for i in range(10):
self.signal.emit(str(i)) #任务线程发射信号用于与图形化界面进行交互
time.sleep(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
mywin = MyWin() # 实例化一个窗口小部件
mywin.setWindowTitle('Hello world!') # 设置窗口标题
mywin.show() #显示窗口
sys.exit(app.exec())
可能看到这部分, 感觉很乱多出了很多代码, 每行代码的意义注释我都已经进行了详细的标注
这里简单说一下建立任务线程的步骤:
- 导入需要的 的类
from PyQt5.QtCore import QThread, pyqtSignal其实为了简单你也可这样写from PyQt5.QtCore import *- 编写任务线程的类 这里的任务线程类是
MyThread并让它继承QThread, 并设置触发信号传递的数据类型, 编写run()函数, 设置触发- 在
MyWin类中的初始化函数中, 初始化一个任务线程, 设置任务线程触发后接受的函数- 在合适的位置启动 任务线程, 比如这里我是在点击按钮后启动的任务线程
- 编写任务线程触发的槽函数
callback()
其实刚学到这里的时候, 我也很懵, 但是很多都是固定的写法, 只要注意上面的几个关键的地方就可以了
启动程序后, 按钮的内容从 0 自增加到 9
这里要注意的是 传递信号必须事先定义好数据类型, 而传递过去的类型必须是已经定义好的数据类型
这里我只说了 任务线程 传递给图形化界面数据(代码中数据是 0, 1, 2, 3…9), 而没有图形界面传递给任务线程数据
下一节说明 图形化界面如何传递给任务线程数据
6. PyQt5 中的多线程的使用(上)的更多相关文章
- OS X 和iOS 中的多线程技术(上)
OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...
- 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)
详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...
- 细说.NET 中的多线程 (一 概念)
为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. ...
- 细说.NET中的多线程 (二 线程池)
上一章我们了解到,由于线程的创建,销毁都是需要耗费大量资源和时间的,开发者应该非常节约的使用线程资源.最好的办法是使用线程池,线程池能够避免当前进行中大量的线程导致操作系统不停的进行线程切换,当线程数 ...
- C#中的多线程 - 同步基础
原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步 ...
- [转载]ArcGIS Engine 中的多线程使用
ArcGIS Engine 中的多线程使用 原文链接 http://anshien.blog.163.com/blog/static/169966308201082441114173/ 一直都想写 ...
- 拒绝卡顿——在WPF中使用多线程更新UI
原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...
- java中的多线程——进度2
package src;/*多线程总结:1,进程和线程的概念. |--进程: |--线程:2,jvm中的多线程体现. |--主线程,垃圾回收线程,自定义线程.以及他们运行的代码的位置 ...
- C#中的多线程-入门
概述与概念C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多 ...
- NET 中的多线程
NET 中的多线程 为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在 ...
随机推荐
- 重新扫描磁盘.bat
工作需要,需要常常扫描磁盘, 以前是先调用磁盘管理器,然后使用alt+a,再按r,完成对磁盘的扫描 但是速度慢效率低 昨天帮朋友装台式电脑系统的时候,他说要给磁盘分区, 发现磁盘内有卷被占用,无法删除 ...
- 在UniApp的H5项目中,生成二维码和扫描二维码的操作处理
在我们基于UniApp的H5项目中,需要生成一些二维码进行展示,另外也需要让用户可以扫码进行一定的快捷操作,本篇随笔介绍一下二维码的生成处理和基于H5的扫码进行操作.二维码的生成,使用了JS文件wea ...
- Dockerfile中ADD命令详细解读
ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD 源路径 目标路径 #test FROM ubuntu MAINTAINER ...
- CI/CD集成
文章转载自:https://kuboard.cn/guide/cicd/ 下图展示了当前比较典型的持续构建集成的一种做法. 在是否自动将最新版本部署到 Kubernetes 环境这个问题上,可能会有多 ...
- Docker 部署 RocketMQ 双主双从模式( 版本v4.7.0)
文章转载自:http://www.mydlq.club/article/96/ 系统环境: 系统版本:CentOS 7.8 RocketMQ 版本:4.7.0 Docker 版本:19.03.13 一 ...
- 使用docker-compose.yml安装rabbitmq集群
1.拉取镜像 集群中每个节点都需要执行 docker pull rabbitmq:3.8.3-management 2.上传docker-compose文件,设置可执行权限 相关文地址:https:/ ...
- 关于Elasticsearch使用java的说明
从Elastic 7.0开始,我们可以不安装JAVA.安装包包含一个相匹配的JAVA版本在里面. Elasticsearch包含来自JDK维护者(GPLv2 + CE)的捆绑版OpenJDK. 要使用 ...
- MongoDB 的用户和角色权限
副本和分片集群的安全设置参考这个:高级:https://files.cnblogs.com/files/sanduzxcvbnm/mongodb_advance.pdf 默认情况下,MongoDB实例 ...
- PAT (Basic Level) Practice (中文)1015 德才论 分数 25
宋代史学家司马光在<资治通鉴>中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子 ...
- [CG从零开始] 3. 安装 pyassimp 库加载模型文件
assimp 是一个开源的模型加载库,支持非常多的格式,还有许多语言的 binding,这里我们选用 assimp 的 python 的 binding 来加载模型文件.不过社区主要是在维护 assi ...