说实话,这些年折腾Python做界面,真是把我搞怕了。写个简单的Excel工具吧,用Tkinter丑得自己都不想看;上Electron吧,一个Hello World就要200多M,启动慢得像老牛拉车;想在Jupyter里做个交互原型,又得学一堆前端框架。烦不烦?
直到前两天,我在GitHub上瞎逛,发现了一个叫PyWry的东西——好家伙,这玩意儿简直是Python桌面开发的救星。
PyWry是什么鬼?能用一句话说清楚吗
简单粗暴地讲,PyWry就是一个能让你的Python代码直接跑出原生系统webview的UI工具包。不是Qt、不是Electron、也不是什么CEF——它直接调用你电脑操作系统自带的浏览器内核:Windows上是WebView2,Mac上是WKWebView,Linux上是WebKitGTK。
啥意思?就是你用HTML/CSS/JS写界面,Python处理后端逻辑,打包出来的exe才几十兆,启动快得飞起。
最骚的是:一套代码,三种玩法
PyWry的设计思路我觉得特别妙——同一个API,给你三个输出目标:
| | |
| 调用OS系统webview,不用Qt/Electron | |
| 基于anywidget+FastAPI+WebSocket | |
| FastAPI服务器 + Redis状态后端,可水平扩展 | |
用一句话概括:Build Once, Render Anywhere。在Jupyter里调好界面,一行代码改成桌面应用,再一行代码发布成Web服务——就是这么任性。
上手有多快?三行代码跑起来
你先pip装一下:
pip install pywry
Linux用户注意啊,系统缺一个依赖,提前装好:
sudo apt-get install libwebkit2gtk-4.1-dev libgtk-3-dev ...
然后写个python文件:
from pywry import PyWry
app = PyWry()
app.show("<h1>Hello 老铁</h1><button onclick='pywry.emit(\"click\")'>点我</button>")
app.block()
跑了没?一个原生窗口弹出来,里面显示你的网页。点一下按钮,还能回调Python函数——这就双向打通了。
除了基础窗口,还有一堆现成的组件
我看了下它的文档,发现连Pandas表格和Plotly图表都内置支持了:
import pandas as pd
from pywry import PyWry
app = PyWry()
df = pd.DataFrame({"姓名": ["张三", "李四", "王五"], "分数": [88, 92, 76]})
app.show_dataframe(df) # 出来一个可排序、可筛选的AgGrid表格
app.block()
更狠的是,它还内置了一个聊天组件,支持OpenAI、Anthropic等大模型的流式输出,还能用slash命令。你想想,几行代码就能给Python程序加一个AI对话侧边栏,这多爽。
要说缺点的实话
也不是没毛病。我试了一下,文档里那个MCP服务器集成有点超前,普通用户可能用不上;另外Linux下得自己装webkit2gtk,Windows和Mac倒是开箱即用。还有一点,如果你要做特别复杂的桌面应用(比如视频剪辑、3D渲染),还是得上Qt。PyWry更适合数据类、工具类、爬虫类的轻量应用。
安装选项怎么选?
它设计得还挺贴心,按需装:
| | |
| pip install 'pywry[notebook]' | |
| pip install 'pywry[auth]' | |
| pip install 'pywry[freeze]' | |
| pip install 'pywry[mcp]' | |
| pip install 'pywry[openai]' | |
| pip install 'pywry[all]' | |
最后说点实在的
我觉得PyWry最大的价值,是让Python开发者不用学Electron、不用碰Node.js,就能做出漂亮的原生桌面应用。而且它还打破了“桌面端、Web端、Notebook端”三者之间的壁垒——写一份代码,哪儿都能跑。
之前我写过一个Excel数据清洗工具,用Tkinter折腾了两周,界面丑得像20年前的软件。要是早知道PyWry,我两天就能搞定,而且还能直接甩给别人一个exe文件,都不用装Python环境。
项目地址:https://github.com/deeleeramone/PyWry