专栏地址 ʅ(‾◡◝)ʃ


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

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. ubuntu下vscode安装go插件失败解决办法

    go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.io,direct go env -w GOSUMDB=gosum.io+ce6e ...

  2. Andrej Karpathy | 详解神经网络和反向传播(基于 micrograd)

    只要你懂 Python,大概记得高中学过的求导知识,看完这个视频你还不理解反向传播和神经网络核心要点的话,那我就吃鞋:D Andrej Karpathy,前特斯拉 AI 高级总监.曾设计并担任斯坦福深 ...

  3. 百度ueditor工具栏配置大全

    toolbars: [[ 'source', // 源代码 'anchor', // 锚点 'undo', // 撤销 'redo', // 重做 'bold', // 加粗 'indent', // ...

  4. 通过使用nginx来实现logstash的负载均衡

    文章转载自:https://blog.csdn.net/UbuntuTouch/article/details/106813223 总结: nginx配置,192.168.0.5 user nginx ...

  5. iOS Social和Accounts简单使用

    ACAccountStore *account = [[ACAccountStore alloc] init]; ACAccountType *type = [account accountTypeW ...

  6. 矩阵顺时针打印(C++)(? 为什么不能AC,9度1391)

    #include <iostream> #include <fstream> using namespace std; int a[1000][1000]; void prin ...

  7. CentOS 7.9 安装 nginx-1.22.0

    一.CentOS 7.9 安装 nginx-1.22.0 下载地址:http://nginx.org/en/download.html 2 安装前的准备 # 操作系统内核版本 uname -a # 操 ...

  8. 洛谷P3376 (最大流模板)

    1 #include<bits/stdc++.h> 2 #define int long long 3 using namespace std; 4 const int maxn=5005 ...

  9. <三>从编译器角度理解C++代码编译和链接原理

    1代码 点击查看代码 **sum.cpp** int gdata=10; int sum(int a,int b){ return a+b; } **main.cpp** extern int gda ...

  10. AlexNet-文献阅读笔记

    论文介绍 ImageNet Classification with Deep Convolutional Neural Networks- Alex Krizhevsky, Ilya Sutskeve ...