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

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

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

1. 使用多线程(QThread)

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

import sys
import time
from PyQt5 import QtWidgets, QtCore
class DataLoader(QtCore.QThread):data_loaded = QtCore.pyqtSignal(object)  # 自定义信号,用于传递加载的数据def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)def run(self):# 模拟耗时的数据加载操作time.sleep(3)  # 假设加载数据需要3秒data = "加载完成的数据"self.data_loaded.emit(data)  # 发射信号,通知主线程数据已加载
class MainWindow(QtWidgets.QMainWindow):def __init__(self):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):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(object)def __init__(self, parent=None):super().__init__(parent)def load_data(self):# 模拟耗时操作QtCore.QThread.sleep(3)data = "加载完成的数据"self.data_loaded.emit(data)
class MainWindow(QtWidgets.QMainWindow):def __init__(self):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.mzph.cn/pingmian/69011.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构:AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风,从概念与定义入手,希望读者能对AutoSAR架构有一个整体的认识,然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接:138. 随机链表的复制 - 力扣(LeetCode) 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,…

Linux——进程间通信之SystemV共享内存

前言 SystemV通信一般包括三种:共享内存、消息队列和信号量。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来…

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言:本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外, 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说, 开始我们的学习吧!! ps:本节正式进入网络层喽, 友友们…

SQLGlot:用SQLGlot解析SQL

几十年来,结构化查询语言(SQL)一直是与数据库交互的实际语言。在一段时间内,不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格,也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化: 信任是我们最宝贵的资产。而现在,它正像黑色星期五促销的廉价平板电视一样,被一点点拆解。在过去,世界很简单:人们相信晚间新闻、那些满是灰尘书籍的教授,或者手持病历、眉头紧锁的医生。而如…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

1-刷力扣问题记录

25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

无用知识研究:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

Jupyterlab和notebook修改文件的默认存放路径的方法

文章目录 1.缘由2.操作流程2.1找到默认的路径2.2创建配置文件2.3修改配置文件内容2.4注意事项 1.缘由 我自己使用jupyterlab的时候,打开是在这个浏览器上面打开的,但是这个打开的文件路径显示的是C盘上面路径,所以这个就很麻烦,因…

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…

音标-- 02-- 重音 音节 变音

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 国际音标1.重音2.音节3.变音 国际音标 1.重音 2.音节 3.变音

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的,是一家日本AI公司SakanaAI的论文(我以前写过他们的不训练提升模型的能力的文章,感兴趣可以去翻)它家有Lion Jones坐镇…