PyWebView:用 Python 构建桌面应用的神器
引言¶
做开发的朋友,或多或少,应该有听过大名鼎鼎的 Electron,一个使用 Web 技术(HTML、CSS 和 JavaScript)构建跨平台桌面应用程序的开源框架。不少知名软件都是使用该框架开发的,比如:Visual Studio Code - 全球开发者广泛使用的轻量级 IDE,微信桌面版 - 中国最大的社交媒体平台微信应用的桌面版,钉钉 - 阿里旗下的企业通讯和协作平台的桌面版,Figma - 绝佳的基于去的协作设计和原型制作平台的桌面版,等等。
使用 Web 技术,可以极大的降低桌面(跨平台)应用的开发门槛,新生代的程序员普遍都会 Web 开发,Web 开发相关的语言(如 HTML、CSS、JavaScript)相对容易上手,拥有完善的开发调试工具,现代浏览器拥有强大的兼容性,开发调试相对简单容易。然后,天生支持跨平台,Web 技术基于标准的网络协议和浏览器的渲染机制运行,这就意味着,只要设备上有支持相应标准的浏览器,用 Web 技术开发的界面就能正常展示,恰恰,如今主流浏览器在各类设备上都广泛存在。并且,Web 领域拥有极其丰富的生态系统和海量资源。借助这些,可以相对容易的构建出精美的界面。
今天的主角是 PyWebView,同样是使用 Web 技术,但后端使用 Python 来构建跨平台桌面应用的开源框架。
老王在使用 Electron 时,遇到几个痛点:
- 老王更熟悉的开发言是 Python,更多的依赖 Python 开发一些小工具或功能,使用 Electron 框架则需要借助类似 IPC、HTTP 等第三方技术来集成 Python 功能,相对复杂,也麻烦不少;
- 打包容易失败,Electron 依赖 Node.js 的生态,而 Node.js 生态库在国内访问不太顺畅,镜像库貌似也不太完善,各个库也容易出现兼容性问题(也可能是老王没有正确设置);
- Electron 集成庞大的 Chromium 浏览器引擎和 Node.js 环境,打包后的文件体积比较大,压缩后基本都要过百兆,很影响软件的分发,特别是本身功能就不多的小工具;
- 访问本地文件比较麻烦,由于浏览器的安全限制,Electron 在访问本地文件时,需要复杂麻烦的过程(事实上,老王并未成功);
就在我为桌面应用开发寻找替代方案时,遇到了 PyWebView。这个库几乎完美地解决了我在 Electron 上遇到的一些痛点,同样是使用 Web 技术栈来构建桌面应用,而整个项目的逻辑部分仍然可以由 Python 来驱动。
- PyWebView 后端使用 Python 语言,提供了一个直接与 Python 双向通讯的机制,Python-JavaScript 桥接接口,与 Python 集成更加简便、友好,也更加稳定,这样能够充分利用 Python 的强大功能,如数据处理、文件操作等,同时结合 Web 界面的灵活性来构建功能丰富的桌面应用;
- 打包相对容易,Python 生态库在国内有不少镜像,各个库的兼容性也要好不少。也可以直接使用 Python 嵌入式运行环境包来打包,可控制程序更强,这里推荐一位大佬制作的工具『PyStand』,打包压缩后可以控制到几兆;
- PyWebView 直接利用了系统已有的浏览器组件,启动过程相对简单,占用资源较小,性能更好,稳定性更好,打包后的文件体积小,启动速度更快;
- PyWebView 提供了简洁的应用程序接口来创建和管理 Web 视图,包含了简便访问本地文件的 API,可以轻松地实现诸如加载 URL、控制页面导航、执行 JavaScript 代码、访问本地文件等操作;
如果你是 Python 党,那么,推荐你使用 PyWebView 来构建桌面应用,PyWebView 能更简便的集成你的 Python 功能。
PyWebView 简介¶
PyWebView 是一个用于在桌面应用程序中嵌入 Web 内容的 Python 库。它允许开发者利用 Web 技术(如 HTML、CSS 和 JavaScript)来构建桌面应用的用户界面,同时结合 Python 的后端逻辑。
PyWebView 的核心特点:
- 跨平台支持,无论是 Windows、macOS 还是 Linux,它都可以无缝运行;
- 使用 Web 技术构建 UI,对于熟悉 Web 技术的开发者来说,几乎没有学习成本,且易于构建精美界面;
- 与 Python 无缝集成,PyWebView 提供了一个 Python-JavaScript 桥接接口,可以非常轻松地从 JavaScript 调用 Python 函数,反之亦然。这意味着你不需要再编写复杂的后端 API,前后端的通信变得非常简单;
- 轻量且易用,与 Electron 不同,PyWebView 是一个非常轻量的库。Electron 需要打包整个 Chromium 浏览器,这会导致应用体积非常庞大,而 PyWebView 则利用系统自带的 Web 引擎,极大地减少了应用的打包体积;
官网:『pywebview』 》》 https://pywebview.flowrl.com/
快速上手 PyWebView¶
安装¶
通过 pip 安装即可
pip install pywebview
构建一个简单的 PyWebView 应用¶
让我们从一个简单的示例开始,打开一个显示 "Hello World" 的网页。
import webview
# 创建一个窗口,显示 "Hello World" 页面
webview.create_window('Hello PyWebView', html='<h1>Hello, PyWebView!</h1>')
webview.start() # 启动应用
运行这段代码后,会弹出一个桌面窗口,里面显示 "Hello, PyWebView!"。
加载本地 HTML 文件¶
除了直接用 HTML 字符串渲染内容,PyWebView 还支持加载本地的 HTML 文件来构建复杂的界面。假设你有一个 index.html 文件。
import webview
# 加载本地 HTML 文件
webview.create_window('本地 HTML 文件', 'index.html')
webview.start() # 启动应用
通过这种方式,你可以轻松使用 Web 技术栈构建界面,并加载本地资源,如样式表、图片和 JavaScript 文件。
与 Python 后端通信¶
PyWebView 的另一个强大功能是它的 Python-JavaScript 桥接功能。你可以在前端调用 Python 函数,实现前后端的无缝通信。让我们来看一个简单的例子:
import webview
# 定义一个后端类,包含一个方法供前端调用
class API:
def say_hello(self, name):
return f'你好, {name}!'
api = API() # 创建 api 实例
# 创建一个窗口,并绑定 API 到前端
webview.create_window('与 Python 通信', html='<button onclick="pywebview.api.say_hello(\'PyWebView\').then(alert)">点击我</button>', js_api=api)
webview.start() # 启动应用
在这个例子中,当用户点击按钮时,JavaScript 会调用 Python 的 say_hello 方法,Python 计算结果后会返回给 JavaScript,然后在前端显示一个弹窗。
王婆卖瓜,自卖自夸¶
老王使用 PyWebView 开发的一个小工具『视频分段进度条生成器』 》》 https://onlookee.cn/soft/toolbox/toolboxes.html
后话¶
PyWebView 是一个简单而强大的工具,特别适合那些希望用 Python 和 Web 技术栈构建桌面应用的开发者。它简化了开发流程,让你可以在熟悉的 Web 开发环境中,专注于界面设计,而后端逻辑仍然由 Python 来负责。
相比于 Electron 这种重量级框架,PyWebView 更加轻量,不会为应用增加过多的体积,并且提供了非常方便的前后端通信接口。
无论是小型的内部工具、数据可视化应用,还是把现有 Web 应用打包为桌面应用,PyWebView 都能为你提供一个简单、易用的解决方案。如果你对 Web 技术和桌面应用开发感兴趣,PyWebView 无疑是一个值得尝试的选择。