浅谈PyQt5中异步刷新UI和Python多线程总结
作者:新安浅滩 发布时间:2023-08-22 01:37:18
目前任务需要做一个界面程序,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
如有错误,欢迎指正~
来源:https://blog.csdn.net/hu694028833/article/details/80977302


猜你喜欢
- 知道如何快速在命令行或者python脚本中实例化一个浏览器通常是非常有用的。每次我需要做任何关于web的自动任务时,我都使用这段python
- 数字滤波分为 IIR 滤波,和FIR 滤波。FIR 滤波:import scipy.signal as signalimport numpy
- Python2.7对于中文编码的问题处理的并不好,这几天在爬数据的时候经常会遇到中文的编码问题。但是本人对编码原理不了解,也没时间深究其中的
- 1 模型定义和TF很像,Pytorch也通过继承父类来搭建模型,同样也是实现两个方法。在TF中是__init__()和
- Python版本是2.7.9,在win8上测试成功,就是抓取有点慢,本来想用多线程的,有事就罢了。模板之家的网站上的url参数与页数不匹配,
- 对于中小型个人、企业网站来说,MySQL数据库或许是目前数据库的最完美实施解决方案了。在不变更服务器硬件的前提下,一个经过良好架构,优化后的
- 前言pycharm可以很方便的管理Python的解释器(如果安装了多个的话),以及第三方模块,包。Pycharm是很多Python开发者的首
- 一年一度的春运又来了,今年我自己写了个抢票脚本。使用Python+Splinter自动刷新抢票,可以成功抢到。(依赖自己的网络环境太厉害,还
- Python列表具有内置的 list.sort()方法,可以在原地修改列表。 还有一个 sorted()内置的函数从迭代构建一个新的排序列表
- 一、概论超大型系统的特点为:1、处理的用户数一般都超过百万,有的还超过千万,数据库的数据量一般超过1TB;2、系统必须提供实时响应功能,系统
- pandas 的日期/时间类型有如下几种:ConceptScalar ClassArray Classpandas Data TypePri
- 呵呵,我之前也写过一个类似的模板替换功能.>> 已实现:>、<、>=、<=、=、==等简单的运算>
- 前奏为了能操作数据库, 首先我们要有一个数据库, 所以要首先安装Mysql, 然后创建一个测试数据库python_test用以后面的测试使用
- python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”我遇到的问题:电脑上已经有
- 目录用Python写一个简单的通讯录一、构思1、定义空列表和一个空字典来存储2、定义功能选项3、添加通讯录功能4、 循环,调用所有的函数功能
- ALTER FUNCTION [dbo].[get_FullAge]( @birthday datetime, @current
- Python tcp socket编程详解初学脚本语言Python,测试可用的tcp通讯程序:服务器:#!/usr/bin/env pyth
- 1.自动转到命名记 <script laguage="javascript"> window.locatio
- def ddns():"""用当前ip更新ddns"""headers = {&
- 如何修改被表单引用的ASP页面?formhandler.asp<HTML><BODY BGCOLOR="