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自身的运行原理和设计 ...
随机推荐
- Go类型断言demo
Go类型断言demo package main import ( "bytes" "encoding/json" "fmt" "i ...
- 日常Bug排查-连接突然全部关闭
日常Bug排查-连接突然全部关闭 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 最近碰到一个问题,一台机器上的连接数在达到 ...
- .NET 基础知识 单文件部署和可执行文件 剪裁独立部署和可执行文件
单文件部署和可执行文件 https://docs.microsoft.com/zh-cn/dotnet/core/deploying/single-file 剪裁独立部署和可执行文件 http ...
- xshell 自动断开连接的解决方法
1. 问题分析 本文Xshell连接自动断开的原因是SSH配置文件的ClientAliveInterval字段设置的超时断开时间小于Xshell的检查断开连接时间. 2. SSH配置文件中的字段详解 ...
- 8.14考试总结(NOIP模拟39)[打地鼠·竞赛图·糖果·树]
一举一动,都是承诺,会被另一个人看在眼里,记在心上的. T1 打地鼠 解题思路 数据范围比较小,不需要什么优化. 直接二维前缀和枚举右下角端点就好了. code #include<bits/st ...
- Qt-udp通信
1 简介 参考视频:https://www.bilibili.com/video/BV1XW411x7NU?p=61 说明:UDP是面向无连接的,客户端并不与服务器不建立连接,直接向服务器发送数据, ...
- MySQL 导出一条数据的插入语句
1.MySQL 导出一条数据的插入语句的方法 在MySQL中,如果我们想要导出一条数据的插入语句,我们可以使用SELECT ... INTO OUTFILE语句(但这通常用于将整个表或查询结果导出到一 ...
- 使用Wesky.Net.Opentools库,一行代码实现实体类类型转换为Json格式字符串
安装1.0.10以及以上版本的 Wesky.Net.OpenTools 包 包内,该功能的核心代码如下: 自定义属性: 实体类JSON模式生成器: 使用方式:引用上面的1.0.10版本或以上的 ...
- ETL工具-nifi干货系列 第十一讲 处理器UpdateAttribute使用教程
1.在这里我们重温下nifi里面一个重要的概念FlowFile,如下图所示: FlowFile:FlowFile代表NiFi中的单个数据.nifi数据流中流动的就是flowfile,每个nifi处理器 ...
- 华为云短信服务教你用C++实现Smgp协议
本文分享自华为云社区<华为云短信服务教你用C++实现Smgp协议>,作者:张俭. 引言&协议概述 中国联合网络通信有限公司短消息网关系统接口协议(SGIP)是中国网通为实现短信业务 ...