浅谈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 相关文章推荐
Python中方法链的使用方法
Feb 23 Python
python使用matplotlib绘图时图例显示问题的解决
Apr 27 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python中turtle作图示例
Nov 15 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
python3+PyQt5使用数据库窗口视图
Apr 24 Python
Python实现基于POS算法的区块链
Aug 07 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python函数装饰器常见使用方法实例详解
Mar 30 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Python 转移文件至云对象存储的方法
Feb 07 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
php设计模式 Chain Of Responsibility (职责链模式)
2011/06/26 PHP
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
laravel安装和配置教程
2014/10/29 PHP
PHP文件缓存类示例分享
2015/01/30 PHP
javascript 匿名函数的理解(透彻版)
2010/01/28 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
jQuery div拖拽用法实例
2016/01/14 Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
2016/05/25 Javascript
jQuery 自定义下拉框(DropDown)附源码下载
2016/07/22 Javascript
JavaScript实战之菜单特效
2016/08/16 Javascript
js转html实体的方法
2016/09/27 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
vue-router实现tab标签页(单页面)详解
2017/10/17 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
对于Python中线程问题的简单讲解
2015/04/03 Python
Python多线程编程简单介绍
2015/04/13 Python
Python中逗号的三种作用实例分析
2015/06/08 Python
python发送邮件功能实现代码
2016/07/15 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python字符串与url编码的转换实例
2018/05/10 Python
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
TensorFlow实现模型评估
2018/09/07 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
德国网上药房:Apotal
2017/04/04 全球购物
巴西最好的男鞋:Rafarillo
2018/05/25 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
幼儿园开学家长寄语
2014/01/19 职场文书
公司市场部岗位职责
2015/04/15 职场文书
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
2022/04/24 Python
django项目、vue项目部署云服务器的详细过程
2022/07/23 Servers