浅谈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中尝试多线程编程的一个简明例子
Apr 07 Python
python开发之list操作实例分析
Feb 22 Python
python使用turtle绘制分形树
Jun 22 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
Oct 29 Python
Python Django给admin添加Action的方法实例详解
Apr 29 Python
Django的models模型的具体使用
Jul 15 Python
python openCV自制绘画板
Oct 27 Python
如何用Python编写一个电子考勤系统
Feb 08 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 Python
python Tkinter模块使用方法详解
Apr 07 Python
python微信智能AI机器人实现多种支付方式
Apr 12 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
PHP 柱状图实现代码
2009/12/04 PHP
PHP XML数据解析代码
2010/05/26 PHP
php curl选项列表(超详细)
2013/07/01 PHP
php遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
浅析application/x-www-form-urlencoded和multipart/form-data的区别
2014/06/22 PHP
php 使用file_get_contents读取大文件的方法
2014/11/13 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP基础之输出缓冲区基本概念、原理分析
2019/06/19 PHP
Bootstrap table两种分页示例
2016/12/23 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
ES6中Iterator与for..of..遍历用法分析
2017/03/31 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python获取外网IP并发邮件的实现方法
2017/10/01 Python
Django admin实现图书管理系统菜鸟级教程完整实例
2017/12/12 Python
Python实现的knn算法示例
2018/06/14 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python 面向对象之封装、继承、多态操作实例分析
2019/11/21 Python
基于pycharm实现批量修改变量名
2020/06/02 Python
一款利用html5和css3动画排列人物头像的实例演示
2014/12/05 HTML / CSS
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
美国鲜花递送:UrbanStems
2021/01/04 全球购物
荷兰睡眠专家:Beter Bed
2020/11/23 全球购物
战略合作意向书范本
2014/04/01 职场文书
2014年清明节寄语
2014/04/03 职场文书
企业新年寄语
2014/04/04 职场文书
会议欢迎标语
2014/06/30 职场文书
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
可可西里观后感
2015/06/08 职场文书
掌握这项技巧,一年阅读300本书不是梦
2019/09/12 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
Python Django 后台管理之后台模型属性详解
2021/04/25 Python
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python