Python3 + Qt5:实现AJAX异步更新UI

embedded/2025/2/2 17:30:16/

使用 Python 和 Qt5 开发时异步加载数据的方法

在开发使用 Python 和 Qt5 的应用程序时,为了避免在加载数据时界面卡顿,可以采用异步加载的方式。以下是几种实现异步加载的方法:

1. 使用多线程(QThread)

通过将数据加载任务放在一个单独的线程中执行,避免阻塞主线程(UI线程),从而实现界面的流畅显示。

import sys
import time
from PyQt5 import QtWidgets, QtCore
class DataLoader(QtCore.QThread):data_loaded = QtCore.pyqtSignal(uiltin">object)  # 自定义信号,用于传递加载的数据def __init__(self, *args, **kwargs):uiltin">super().__init__(*args, **kwargs)def run(self):# 模拟耗时的数据加载操作time.sleep(3)  # 假设加载数据需要3秒data = "加载完成的数据"self.data_loaded.emit(data)  # 发射信号,通知主线程数据已加载
class MainWindow(QtWidgets.QMainWindow):def __init__(self):uiltin">super().__init__()self.setWindowTitle("异步加载数据示例")self.resize(400, 200)self.label = QtWidgets.QLabel("正在加载数据...", self)self.label.setAlignment(QtCore.Qt.AlignCenter)self.setCentralWidget(self.label)# 创建并启动数据加载线程self.loader = DataLoader()self.loader.data_loaded.connect(self.on_data_loaded)  # 连接信号到槽函数self.loader.start()def on_data_loaded(self, data):self.label.setText(data)  # 更新UI
if __name__ == "__main__":app = QtWidgets.QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

2. 使用 asyncio 和 quamash

asyncio 是 Python 的异步编程库,quamash 是一个将 asyncio 与 Qt 事件循环集成的库。

import asyncio
from PyQt5 import QtWidgets
from quamash import QEventLoop
async def load_data():await asyncio.sleep(3)  # 模拟异步加载数据return "异步加载完成的数据"
class MainWindow(QtWidgets.QMainWindow):def __init__(self, loop):uiltin">super().__init__()self.loop = loopself.setWindowTitle("异步加载数据示例")self.resize(400, 200)self.label = QtWidgets.QLabel("正在加载数据...", self)self.label.setAlignment(QtCore.Qt.AlignCenter)self.setCentralWidget(self.label)# 启动异步加载任务asyncio.ensure_future(self.load_data_async())async def load_data_async(self):data = await load_data()self.label.setText(data)
if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)loop = QEventLoop(app)asyncio.set_event_loop(loop)window = MainWindow(loop)window.show()with loop:loop.run_forever()

3. 使用信号槽机制

通过信号槽机制,将耗时操作与UI更新分离,确保数据加载完成后才更新UI。

from PyQt5 import QtWidgets, QtCore
class DataWorker(QtCore.QObject):data_loaded = QtCore.pyqtSignal(uiltin">object)def __init__(self, parent=None):uiltin">super().__init__(parent)def load_data(self):# 模拟耗时操作QtCore.QThread.sleep(3)data = "加载完成的数据"self.data_loaded.emit(data)
class MainWindow(QtWidgets.QMainWindow):def __init__(self):uiltin">super().__init__()self.setWindowTitle("异步加载数据示例")self.resize(400, 200)self.label = QtWidgets.QLabel("正在加载数据...", self)self.label.setAlignment(QtCore.Qt.AlignCenter)self.setCentralWidget(self.label)self.worker = DataWorker()self.worker_thread = QtCore.QThread()self.worker.moveToThread(self.worker_thread)self.worker_thread.start()self.worker.data_loaded.connect(self.on_data_loaded)QtCore.QTimer.singleShot(0, self.worker.load_data)def on_data_loaded(self, data):self.label.setText(data)
if __name__ == "__main__":import sysapp = QtWidgets.QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

总结

  • 如果你熟悉多线程编程,可以使用 QThread
  • 如果你希望使用更现代的异步编程方式,可以结合 asyncioquamash
  • 如果你希望代码结构更清晰,可以使用信号槽机制。
    根据你的具体需求选择合适的方法即可。


http://www.ppmy.cn/embedded/158958.html

相关文章

【Rust自学】18.1. 能用到模式(匹配)的地方

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 18.1.1. 什么是模式 模式(pattern) 是Rust里的一种特殊的语法,用于匹配复杂和简…

C++中的类型转换

文章目录 一、概述二、隐式类型转换(Implicit Conversion)三、显式类型转换(Explicit Conversion)四、C 风格类型转换 一、概述 C 提供了多种类型转换(Type Conversion)方式,以便在不同类型的数…

Spring AOP 入门教程:基础概念与实现

目录 第一章:AOP概念的引入 第二章:AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章:Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…

C语言初阶牛客网刷题—— HJ34 图片整理【难度:中等】

1. 题目描述 牛客网在线OJ链接 Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。 输入描述:Lily使用的图片包括 “A…

JavaScript系列(43)--依赖注入系统实现详解

JavaScript依赖注入系统实现详解 💉 今天,让我们深入探讨JavaScript的依赖注入系统实现。依赖注入是一种设计模式,它通过将依赖关系的创建和管理从代码中分离出来,提高了代码的可维护性和可测试性。 依赖注入基础概念 &#x1f…

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…

面试经典150题——图的广度优先搜索

文章目录 1、蛇梯棋1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、最小基因变化2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词接龙3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 1、蛇梯棋 1.1 题目链接 点击跳转到题目位置 1.2 题目描述 给你一…

Anaconda使用教程 如何conda配置多版本Python环境

配置anaconda参考anaconda的安装和使用(管理python环境看这一篇就够了)-CSDN博客 Anaconda使用教程 主要用的两个为Anaconda Prompt 和Anaconda Navigator 打开cmd 第一次安装配置好conda的得先执行 conda init才能用 以后的创建环境和环境切换&…