浅谈PyQt5中异步刷新UI和Python多线程总结


Posted in Python onDecember 13, 2019

目前任务需要做一个界面程序,PyQt是非常方便的选择,QT丰富的控件以及python方便的编程。近期遇到界面中执行一些后台任务时界面卡死的情况,解决了在这里记录下。

PyQt

PyQt简介

PyQt是Qt的python接口,PyQt的文档较少,但接口和函数可以完全参照Qt,继承了Qt中大量的控件以及信号机制,十分方便。以下简介一个基本的PyQt程序。

- 需要导入的类主要来自三个包

- from PyQt5.QtWidgets import 常用的控件

- PyQt5.QtCore 核心功能类,如QT,QThread,pyqtSignal

- PyQt5.QtGui UI类,如QFont

- 基础的程序结构:

class Example(QWidget):
 def __init__(self):
  super()__init__()
  self.setupUI()

 def setupUI():
  self.show()
  pass
  # 设置UI
if __name__ == '__main__':
 app = QApplication(sys.argv) # 启动app
 ex = Example() # 实例化一个自己派生的
 # 也可以实例化库中的控件
 # q = QPushButton()
 # q.show()
 sys.exit(app.exec_())

总体来说:

1. 首先实例化APP

2. 实例化预定义控件或者自己派生自库中的控件,记得调用show()函数

3. 执行并安全退出

Python中的多线程

python中的多线程使用较为方便,主要使用threading.Thread类:

1. 线程启动使用start()函数

2. 如果需要等待线程执行使用join,这样主线程会阻塞

实现方式一

直接传入函数,启动线程,可以传入参数

import time, threading
def threadFunction():
 while True:
  print(11111)
  time.sleep()
# 用于命名,可以通过threading.current_thread().name获得
t = threading.Thread(target=threadFunction, name='funciton')
# 如果线程有参数
t = threading.Thread(target=threadFunction, args=(), name='funciton')
t.start()

实现方式二

继承Thread,重写run方法

from threading import Thread
import time

class Example(Thread):
 def __init__(self):
  super().__init__()

 def run(self):
  while True:
   time.sleep(1)
   print(11111111)

if __name__ == '__main__':
 a = Example()
 a.start()
 a.join()
 print(222222222)

注意:

1. 使用join方法会让主线程阻塞在这里,等待子线程结束,在里面可以设置阻塞的时间

2. a.setDaemon(True)在start前设置,可以保证在主线程终止时,子线程也终止

信号机制

QT中的信号机制能够方便的编写回调。

1. 很多控件都有预定的信号如clicked,直接使用clicked.connect连接槽函数即可。

2. 继承自Qt的类,然后自定义一个signal类变量,在实例连接信号就可以了

class Example(QWidget):
 signal = pyqtSignal() # 括号里填写信号传递的参数
 # 发射信号
 def func(self):
  self.signal.emit()

# 使用信号
a = Example()
a.signal.connect(callback)

# 槽函数
def callback():
 pass

UI刷新

在界面中,通常用会有一些按钮,点击后触发事件,比如去下载一个文件或者做一些操作,这些操作会耗时,如果不能及时结束,主线程将会阻塞,这样界面就会出现未响应的状态,因此必须使用多线程来解决这个问题。

注意:

1. PyQt5不能在子线程中刷新线程,这样会造成界面卡死,因此不能使用常规的多线程刷新UI。

2. 但是又必须要实现子线程和主线程之间的通信,否则无法得知任务是否完成。因此使用PyQt5中的QThread,这样既可以使用信号机制,又能够使用多线程。

3. 当启动多线程后,注册信号,槽函数为主线程中的函数,当任务完成后,发射信号,在主线程中对UI进行更新。

注:由于需要注册信号,thread需要是继承自QThread的类

class Example(QThread):
 signal = pyqtSignal() # 括号里填写信号传递的参数
 def __init__(self):
  super().__init__()

 def __del__(self):
  self.wait()

 def run(self):
  # 进行任务操作
  self.signal.emit() # 发射信号

# UI类中
def buttonClick(self)
 self.thread = Example()
 self.thread.signal.connect(self.callback)
 self.thread.start() # 启动线程

def callbakc(self):
 pass

如有错误,欢迎指正~

以上这篇浅谈PyQt5中异步刷新UI和Python多线程总结就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在ironpython中利用装饰器执行SQL操作的例子
May 02 Python
python实现爬虫下载美女图片
Jul 14 Python
Python松散正则表达式用法分析
Apr 29 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
Aug 07 Python
Python通过Tesseract库实现文字识别
Mar 05 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
Qt自定义Plot实现曲线绘制的详细过程
Nov 02 Python
基于Python实现流星雨效果的绘制
Mar 18 Python
python编写微信公众号首图思路详解
Dec 13 #Python
selenium+python实现自动登陆QQ邮箱并发送邮件功能
Dec 13 #Python
python中设置超时跳过,超时退出的方式
Dec 13 #Python
python opencv实现gif图片分解的示例代码
Dec 13 #Python
python多进程并发demo实例解析
Dec 13 #Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 #Python
python plotly画柱状图代码实例
Dec 13 #Python
You might like
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
input file获得文件根目录简单实现
2013/04/26 PHP
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
php中JSON的使用方法
2015/04/30 PHP
autoIMG 基于jquery的图片自适应插件代码
2011/03/12 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
JavaScript控制按钮可用或不可用的方法
2015/04/03 Javascript
JavaScript获取DOM元素的11种方法总结
2015/04/25 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
JS实现淡入淡出图片效果的方法分析
2016/12/20 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
Vue.js 利用v-for中的index值实现隔行变色
2018/08/01 Javascript
JavaScript实现淘宝京东6位数字支付密码效果
2018/08/18 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
微信小程序实现Swiper轮播图效果
2019/11/22 Javascript
javascript将16进制的字符串转换为10进制整数hex
2020/03/05 Javascript
JavaScript实现简单的弹窗效果
2020/05/19 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Vue的Options用法说明
2020/08/14 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
python实现中文输出的两种方法
2015/05/09 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
英国领先的男士服装和时尚零售商:Burton
2017/01/09 全球购物
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
事务机电主管工作职责
2014/02/25 职场文书
农村党支部书记司法四风问题对照检查材料
2014/09/26 职场文书
利用Python实现Picgo图床工具
2021/11/23 Python
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android