PyQt5 使用 aiohttp 发送异步请求

news/2024/10/14 14:38:50

PyQt5 使用 aiohttp 发送异步请求

本文使用PyQt5演示,如何结合aiohttp库,发送异步请求

代码结构

本文中全部代码全在test_async_request.py这一个文件中编码,步骤中有变动的地方会注释标注,无改动的不会重复显示出来,需要看完整代码的,可直接移步到末尾。

需要安装PyQt5,aiohttp==3.8.6,asyncqt

一. 创建测试页面

首先我们需要创建一个窗口,用于显示请求响应的内容

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_async_request.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 使用 aiohttp 发送异步请求
"""
import sys
import asyncio
from PyQt5.QtWidgets import QApplication, QPushButton, QLabel, QVBoxLayout, QWidget
import aiohttp
from asyncqt import QEventLoopclass MainWindow(QWidget):def __init__(self):super().__init__()self.setFixedSize(800, 80)self.setWindowTitle("PyQt5 使用 aiohttp")# 创建 QLabel QPushButtonself.label = QLabel("按下按钮发出请求", self)self.button = QPushButton("发送 GET 请求", self)# 设置布局layout = QVBoxLayout()layout.addWidget(self.label)layout.addWidget(self.button)self.setLayout(layout)if __name__ == "__main__":app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

运行后,可以得到下面这样的窗口
image

二. 实现异步请求

使用aiohttp实现异步请求

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_async_request.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 使用 aiohttp 发送异步请求
"""
class MainWindow(QWidget):def __init__(self):super().__init__()...  # 忽略self.button.clicked.connect(self.handle_request)def handle_request(self):# 在事件循环中运行异步函数asyncio.create_task(self.fetch_data())async def fetch_data(self):url = 'https://api.github.com/repos/YQBaobao/RollerCoaster/tags'async with aiohttp.ClientSession() as session:async with session.get(url) as response:if response.status == 200:data = await response.json()tags = [tag['name'] for tag in data][:3]# 更新标签self.label.setText(f"Title: {tags}")else:self.label.setText(f"请求失败: {response.status}")

但是此时我们不能直接运行,因为:PyQt5 的事件循环与 asyncio 的事件循环不兼容,需要手动运行 asyncio 的事件循环。

三. 手动启动事件循环

为了解决事件循环不兼容问题,可以使用 asyncioQEventLoop 或者 asyncqt 库来桥接 asyncioPyQt5 的事件循环。
以下是使用 asyncqt 库举例

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
"""
@ File        : test_async_request.py
@ Author      : yqbao
@ Version     : V1.0.0
@ Description : 使用 aiohttp 发送异步请求
"""
class MainWindow(QWidget):...  # 忽略无变化if __name__ == "__main__":app = QApplication(sys.argv)# 创建 asyncio 事件循环loop = QEventLoop(app)asyncio.set_event_loop(loop)window = MainWindow()window.show()# sys.exit(app.exec_())# 在 asyncio 事件循环中运行应用程序with loop:loop.run_forever()

启动,并点击发送 GET 请求 按钮:
image

四. 完整代码

完整代码见:GitHub,Gitee

本文章的原文地址
GitHub主页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71447.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

华为 OD 的职级与薪资。。

大家好,我是R哥。 之前分享了一篇《冲进数字马力了!真滴香!!》,这是大厂内包,今天说说华为 OD,一种不同于普通外包的高级外包。 华为 OD,我们面试辅导也弄了不少人进去,很多小伙伴纳闷华为 OD 和华为正编、华为外包有什么区别? 一提到外包,可能大多数人都会嗤之以鼻…

HyperMesh基础教程:概述与有限元分析简介

1.1 HyperMesh 概述 本节将介绍有限单元法基本原理,HyperMesh 软件基本功能及界面介绍,获取在线帮助等内容。 1.1.1 有限元分析方法简介 有限单元法(FEM)是一种可以精确预测复杂结构在外界载荷作用下响应的方法,该数值方法起源于上世纪 50 年代。在有限单元法出现之前,验…

测试一下博客园的xss攻击防御,无恶意

★~!@#$%^&*()_+<>,./?;"[]{}- ★%3Cinput /%3E ★%3Cscript%3Ealert(XSS1)%3C/script%3E ★ ★ ★<input/ ★ ★ ★ ★javascript:alert(/xss5/) ★javascript:alert(/xss6/) ★ ★ ★<img src="#"/**/onerror=alert(/xss9/) width=100> ★…

使用 acme.sh 生成免费 90 天的 SSL 泛域名证书

原文地址求你点进去看,给自己的博客加加热度 https://typecho.hanzhe.site/archives/13.htmlacms.sh 是 Github 上开源的一款 SSL 证书申请工具,该工具安装配置完成后可帮我们申请免费 SSL 证书,并通过定时任务实现证书自动续期,理论上配置一次终生实用,官方有提供了中文文…

idea社区版配置springboot项目问题分析及处理

前言 记录一次使用IDEA社区版配置SpringBoot项目的经历,包括遇到的问题及解决过程 IDEA版本:IntelliJ IDEA 2024.2.3 (Community Edition) 问题描述1 IDEA社区版中并不支持Spring项目的创建等其他操作,在导入项目后无法自动识别,需要手动进行配置 解决过程1 项目导入后,在…

css图像

1.利用width,height属性控制图像的大小。 <!DOCTYPE html> <html><head><title>Image Sizes</title><style type="text/css">img.large {width: 500px;height: 500px;}img.medium {width: 250px;height: 250px;}img.small {widt…

AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo

AvaloniaTCP-v1.0.0:学习使用Avalonia/C#进行TCP通讯的一个简单Demo。TCP通讯简介 TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。它确保数据包按顺序传输,并在必要时进行重传,以保证数据的完整性和准确性。TC…