专栏地址 ʅ(‾◡◝)ʃ


这一节引入了多线程这个非常重要概念, 在我认为多线程的重要性是紧紧次于信号与槽函数的, 因为在平时经常使用

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())

可能看到这部分, 感觉很乱多出了很多代码, 每行代码的意义注释我都已经进行了详细的标注
这里简单说一下建立任务线程的步骤:

  1. 导入需要的 的类 from PyQt5.QtCore import QThread, pyqtSignal 其实为了简单你也可这样写 from PyQt5.QtCore import *
  2. 编写任务线程的类 这里的任务线程类是 MyThread 并让它继承 QThread , 并设置触发信号传递的数据类型, 编写 run()函数, 设置触发
  3. MyWin 类中的初始化函数中, 初始化一个任务线程, 设置任务线程触发后接受的函数
  4. 在合适的位置启动 任务线程, 比如这里我是在点击按钮后启动的任务线程
  5. 编写任务线程触发的槽函数 callback()

其实刚学到这里的时候, 我也很懵, 但是很多都是固定的写法, 只要注意上面的几个关键的地方就可以了
启动程序后, 按钮的内容从 0 自增加到 9
这里要注意的是 传递信号必须事先定义好数据类型, 而传递过去的类型必须是已经定义好的数据类型
这里我只说了 任务线程 传递给图形化界面数据(代码中数据是 0, 1, 2, 3…9), 而没有图形界面传递给任务线程数据
下一节说明 图形化界面如何传递给任务线程数据

6. PyQt5 中的多线程的使用(上)的更多相关文章

  1. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  2. 详细分析 Java 中实现多线程的方法有几种?(从本质上出发)

    详细分析 Java 中实现多线程的方法有几种?(从本质上出发) 正确的说法(从本质上出发) 实现多线程的官方正确方法: 2 种. Oracle 官网的文档说明 方法小结 方法一: 实现 Runnabl ...

  3. 细说.NET 中的多线程 (一 概念)

    为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在不同的线程中进行. ...

  4. 细说.NET中的多线程 (二 线程池)

    上一章我们了解到,由于线程的创建,销毁都是需要耗费大量资源和时间的,开发者应该非常节约的使用线程资源.最好的办法是使用线程池,线程池能够避免当前进行中大量的线程导致操作系统不停的进行线程切换,当线程数 ...

  5. C#中的多线程 - 同步基础

    原文:http://www.albahari.com/threading/part2.aspx 文章来源:http://blog.gkarch.com/threading/part2.html 1同步 ...

  6. [转载]ArcGIS Engine 中的多线程使用

    ArcGIS Engine 中的多线程使用 原文链接 http://anshien.blog.163.com/blog/static/169966308201082441114173/   一直都想写 ...

  7. 拒绝卡顿——在WPF中使用多线程更新UI

    原文:拒绝卡顿--在WPF中使用多线程更新UI 有经验的程序员们都知道:不能在UI线程上进行耗时操作,那样会造成界面卡顿,如下就是一个简单的示例: public partial class MainW ...

  8. java中的多线程——进度2

    package src;/*多线程总结:1,进程和线程的概念.    |--进程:    |--线程:2,jvm中的多线程体现.    |--主线程,垃圾回收线程,自定义线程.以及他们运行的代码的位置 ...

  9. C#中的多线程-入门

    概述与概念C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行.一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多 ...

  10. NET 中的多线程

    NET 中的多线程 为什么使用多线程 使用户界面能够随时相应用户输入 当某个应用程序在进行大量运算时候,为了保证应用程序能够随时相应客户的输入,这个时候我们往往需要让大量运算和相应用户输入这两个行为在 ...

随机推荐

  1. [Python]-openpyxl模块Excel数据处理-读取公式的结果

    日常需要Python来处理各种数据,处理Excel数据常用的库一般有openpyxl.xlrd(读取).xlwt(写入). 经过对比发现openpyxl模块比较好用. openpyxl模块 这篇笔记比 ...

  2. 更改elasticsearch中索引的mapping

    文章转载自:https://www.cnblogs.com/uglyliu/p/12331964.html 昨天研发说在kibana中统计userid字段不出图,后来查到该字段显示冲突了,然后再查看了 ...

  3. python 代码执行顺序

    Python代码在执行过程中,遵循下面的基本原则: 普通语句,直接执行: 碰到函数,将函数体载入内存,并不直接执行 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行 碰到if.for等控制语句 ...

  4. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  5. GitHub 供应链安全已支持 Dart 开发者生态

    通过 Dart 和 GitHub 团队的共同努力,自 10 月 7 日起,GitHub 的 Advisory Database (安全咨询数据库).Dependency Graph (依赖项关系图) ...

  6. JavaScript基本语法(JavaScript代码嵌入方式与声明和使用变量)

    .JavaScript代码嵌入方式 #①HTML文档内 JavaScript代码要写在script标签内 script标签可以写在文档内的任意位置 为了能够方便查询或操作HTML标签(元素)scrip ...

  7. C语言二叉树遍历及路径查找

    #include<iostream> #include<stdio.h> #include<math.h> #include<malloc.h> usi ...

  8. HTML元素大全(2)-表单

    01.<form>表单 <form> 表单是比较重要的HTML元素,块元素,主要作用是向服务端提交数据.结合表单元素input使用,通过内部的button按钮提交(type=& ...

  9. Linq--取group分组后的每组第一条数据

    Linq对指定字段分组并取每组第一个值 先排序后分组 目的:取每个RequestID组内的最大HistoryID的数据 //对RequestID进行分组降序排序,去每组的第一条数据 IList< ...

  10. ahk精简自用

    ;9:03 2022/8/20 自用 #NoEnv #Warn #SingleInstance Force ;设工作目录为桌面 SetWorkingDir %A_Desktop% ;托盘提示必须放在热 ...