浅谈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为tornado添加recaptcha验证码功能
Feb 26 Python
用Python解析XML的几种常见方法的介绍
Apr 09 Python
Python遍历目录并批量更换文件名和目录名的方法
Sep 19 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
Python编程实现双链表,栈,队列及二叉树的方法示例
Nov 01 Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 Python
详解Django之auth模块(用户认证)
Apr 17 Python
python3实现163邮箱SMTP发送邮件
May 22 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
Python 输入一个数字判断成绩分数等级的方法
Nov 15 Python
详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件
Aug 23 Python
解决python 文本过滤和清理问题
Aug 28 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编译安装中遇到的两个错误和解决方法
2014/08/20 PHP
php中限制ip段访问、禁止ip提交表单的代码分享
2014/08/22 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
extjs两个tbar问题探讨
2013/08/08 Javascript
document.forms[].submit()使用介绍
2014/02/19 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
全面解析Bootstrap布局组件应用
2016/02/22 Javascript
阻止表单提交按钮多次提交的完美解决方法
2016/05/16 Javascript
Javascript中的arguments对象
2016/06/20 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
js倒计时小实例(多次定时)
2016/12/08 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
layui checkbox默认选中,获取选中值,清空所有选中项的例子
2019/09/02 Javascript
vue穿梭框实现上下移动
2021/01/29 Vue.js
Python threading多线程编程实例
2014/09/18 Python
基于Python实现用户管理系统
2019/02/26 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
HTML5 文件上传下载的实例代码
2017/07/03 HTML / CSS
印尼在线精品店:Berrybenka.com
2016/10/22 全球购物
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
印度网上药店:1mg
2017/10/13 全球购物
Made in Design意大利:现代家具、名家灯具和装饰
2020/10/27 全球购物
extern在函数声明中是什么意思
2014/01/19 面试题
成都思必达公司C#程序员招聘面试题
2013/06/26 面试题
学生个人求职自荐信格式
2013/09/23 职场文书
电脑教师的教学自我评价
2013/11/26 职场文书
网站开发实习生的自我评价
2013/12/11 职场文书
《飞向蓝天的恐龙》教学反思
2014/04/09 职场文书
留守儿童工作方案
2014/06/02 职场文书
计算机网络专业自荐信
2014/07/04 职场文书
教学改革问题查摆整改措施
2014/09/27 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
手术室消毒隔离制度
2015/08/05 职场文书