200 行 ,一个PYQT 窗口 + 后台 AIOHTTP 服务 , 例子
直接上代码
import sys
from typing import Dict, List
from aiohttp import web
import asyncio
from functools import wraps
from blinker import Signal
from PySide6 import QtCore as qc
from PySide6 import QtGui as qg
from PySide6 import QtWidgets as qw
def get(path):
def _f1(fn):
@wraps(fn)
async def _f2(self: "Routes", *args, **kw):
async with self.lock:
self.count += 1
if self.count >= self.max:
self.max = self.count
ret = await fn(self, *args, **kw)
async with self.lock:
self.count -= 1
return ret
_f2.path = path
_f2.method = "get"
return _f2
return _f1
class Routes:
def __init__(self, app: web.Application) -> None:
self.lock = asyncio.Lock()
self.count = 0
self.max = 0
self.add_routes(app)
@get("/")
async def get_g1(self, request):
return {1: 2, 2: 3, 3: "中国"}
def add_routes(self, app: web.Application):
get_lst = []
for name in self.__dir__():
if name.startswith("get_"):
att = getattr(self, name)
if callable(att):
assert hasattr(att, "path")
assert hasattr(att, "method")
path = getattr(att, "path")
get_lst.append(web.get(path, att))
app.add_routes(get_lst)
async def logger_mdw(app, handler):
async def _h1(request: web.Request):
print(request.method, request.path)
return await handler(request)
return _h1
async def reponse_mdw(app, handler):
async def _h1(request: web.Request):
ret = await handler(request)
print(type(ret))
if isinstance(ret, web.Response):
print(3)
return ret
elif isinstance(ret, (str, int, float)):
print(1)
return web.Response(text=str(ret))
elif isinstance(ret, (Dict, List)):
return web.json_response(ret)
else:
print(4)
return web.Response(text=str(ret))
return _h1
class sv(qc.QObject):
sg = Signal()
def __init__(self, loop: asyncio.AbstractEventLoop, ft: asyncio.Future) -> None:
super().__init__()
self.loop = loop
self.ft = ft
async def run_server(self):
server = web.Application()
server.middlewares.append(logger_mdw)
server.middlewares.append(reponse_mdw)
Routes(server)
runner = web.AppRunner(server)
# 3----------------------------------
await runner.setup()
site = web.TCPSite(runner, "127.0.0.1", 8080)
await site.start()
print(f"======= Serving on http://{site._host}:{site._port}/ ======")
return site
async def server_container(self):
site = await self.run_server()
await self.ft # 等待约定的信号传过来
await site.stop()
self.sg.send()
def start(self):
self.loop.run_until_complete(self.server_container())
def stop(self):
self.loop.call_soon_threadsafe(self.ft.set_result, None)
class newth(qc.QThread):
v: sv
def run(self):
loop = asyncio.new_event_loop()
ft = asyncio.Future(loop=loop)
self.v = sv(loop, ft)
self.v.moveToThread(self)
try:
self.v.start()
except Exception as e:
print(e)
finally:
print("server finished ..........")
def stop(self):
if hasattr(self, "v") and self.v is not None:
self.v.stop()
class mw(qw.QDialog):
def __init__(self) -> None:
super().__init__()
ly = qw.QHBoxLayout()
self.setLayout(ly)
self.b1 = qw.QPushButton("start")
self.b1.clicked.connect(self.on_b1_clicked)
ly.addWidget(self.b1)
self.resize(200, 200)
self.th = None
def on_b1_clicked(self):
self.b1.setEnabled(False)
if self.th is None:
self.th = newth()
self.th.started.connect(self.b1_update)
self.th.finished.connect(self.b1_update)
self.th.start()
else:
self.th.stop()
def b1_update(self):
if self.th is None or self.th.isFinished():
self.th = None
self.b1.setEnabled(True)
self.b1.setText("start")
else:
self.b1.setEnabled(True)
self.b1.setText("stop")
def closeEvent(self, arg__1: qg.QCloseEvent) -> None:
if self.th is not None:
self.on_b1_clicked()
arg__1.ignore()
else:
arg__1.accept()
if __name__ == "__main__":
app = qw.QApplication()
ss = mw()
ss.show()
app.exec()
sys.exit()
200 行 ,一个PYQT 窗口 + 后台 AIOHTTP 服务 , 例子的更多相关文章
- 200行代码实现RPC框架
之前因为项目需要,基于zookeeper和thrift协议实现了一个简单易用的RPC框架,核心代码不超过200行. zookeeper主要作用是服务发现,thrift协议作为通信传输协议, 基于com ...
- 只用200行Go代码写一个自己的区块链!
Coral Health · 大约23小时之前 · 220 次点击 · 预计阅读时间 7 分钟 · 不到1分钟之前 开始浏览 区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大 ...
- 只用200行Go代码写一个自己的区块链!(转)
区块链是目前最热门的话题,广大读者都听说过比特币,或许还有智能合约,相信大家都非常想了解这一切是如何工作的.这篇文章就是帮助你使用 Go 语言来实现一个简单的区块链,用不到 200 行代码来揭示区块链 ...
- SpringBoot,用200行代码完成一个一二级分布式缓存
缓存系统的用来代替直接访问数据库,用来提升系统性能,减小数据库复杂.早期缓存跟系统在一个虚拟机里,这样内存访问,速度最快. 后来应用系统水平扩展,缓存作为一个独立系统存在,如redis,但是每次从缓存 ...
- java在线聊天项目0.8版 实现把服务端接收到的信息返回给每一个客户端窗口中显示功能
迭代器的方式会产生锁定 服务器端增加发送给每个客户端已收到信息的功能 所以当获取到一个socket,并打开它的线程进行循环接收客户端发来信息时,我们把这个内部类的线程Client保存到集合List&l ...
- 部署基于.netcore5.0的ABP框架后台Api服务端,以及使用Nginx部署Vue+Element前端应用
前面介绍了很多关于ABP框架的后台Web API 服务端,以及基于Vue+Element前端应用,本篇针对两者的联合部署,以及对部署中遇到的问题进行处理.ABP框架的后端是基于.net core5.0 ...
- 第一个PyQt程序
这个程序虽然小,具备pyqt程序的皱型,可以作为一个模板使用了 #!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtW ...
- (7)nehe教程1 创建一个OpenGL窗口:
不要用那个nehe ndk了 误人子弟! 转自: 一个窗口,代码可真多啊 http://www.yakergong.net/nehe/ 在这个教程里,我将教你在Windows环境中创建OpenGL程序 ...
- 简单的.NET后台定时服务框架
后台服务只要是有一定经验的开发人员都接触过,其中离不开服务创建,调度逻辑处理,业务逻辑编写等环节.往往我们在新建一个后台服务项目的时候都会去拷贝以前的代码,再写一些线程等方式去完成,然后又去处理服务的 ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...
随机推荐
- Linux 环境下安装redis
目录 方法一 编辑安装 1.官网找到下载地址: 2.到目录下载redis安装包 3.下载后解压 4.安装工具 tcl (可以跳过) 5.编译安装 6.修改配置文件 7. 客户端连接 8.配置环境变量 ...
- 在jeecg-boot中密码的使用
1.生成密码并入库保存 String id= SnowflakeIdUtil.nextValue();//生成id operatCompany.setId(id); String salt = oCo ...
- Echarts设置饼状图保证你看的明明白白
简单的饼状图 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- TCP协议分析工具TcpEngine V1.2.0使用教程
概述 目前主流的网络数据分析工具主要有两类,一类是http协议分析工具,如fiddler,这类工具擅长对字符串类型协议分析:另一类是原始网络数据包的监听分析,如Wireshark,这类工具擅长分析网络 ...
- 4G 信令中的 PCO 字段
目录 文章目录 目录 Protocol Configuration Option Protocol Configuration Option PCO(Protocol Configuration Op ...
- EDP .Net开发框架--自动化日志
平台下载地址:https://gitee.com/alwaysinsist/edp 自动化日志不需要额外调用日志相关功能即可无感实现程序集方法调用的日志记录. 创建业务逻辑处理类 public cla ...
- 【c++】函数模板
语法: template<class & T1,class &T2> auto Add(T1 t,T2 t2) ->decltype(t+t2); 函数定义: t ...
- exe应用程序安装为windows服务
1.使用instsrv.exe和srvany.exe 当你获取到srvany后并决定将某程序作为服务启动后,请先将srvany安装为系统服务,具体的安装方法有很多,这里使用instsrv,语法如下:安 ...
- 使用Newtonsoft.Json进行Json与XML相互转换
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析好像没啥难度.今天突然发现Newtonsoft.Json中有关于Json和XML互转的方法,所以顺带记录总结一下. 一.关于Newtons ...
- WPF开发快速入门【8】WPF进行简单的3D开发
概述 本文介绍采用WPF进行3D开发的一些基础知识,还有HelixToolkit控件的介绍以及在MVVM模式下使用3D框架. 3D开发入门 官方文档对3D开发的一些基础知识已经描述的比较详细了:三维图 ...