跳转至

PyWebView:用 Python 构建桌面应用的神器

标签:编程开发pythonGUI    🚩🚩🚩


引言

pywebview

做开发的朋友,或多或少,应该有听过大名鼎鼎的 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 无疑是一个值得尝试的选择。


本文链接

https://onlookee.cn/dev/python/pywebview.html

~~~ 欢迎转载 ~~~ 欢迎收藏 ~~~ 欢迎评论 ~~~