
PyWebView 是一个轻量级的跨平台 Python 库,它的核心思路很直接:在桌面应用中嵌入系统原生的 WebView 组件。这意味着你可以用 HTML、CSS 和 JavaScript 来构建界面,同时让 Python 处理业务逻辑——非常适合'Web 技术做 UI + Python 做后端'的场景。
核心定位
PyWebView 并不是 Electron 那种打包 Chromium 的替代品,它更倾向于复用系统自带的 WebView(比如 Windows 的 Edge/IE、macOS 的 WebKit、Linux 的 GTK+Webkit 或 Qt WebEngine)。这样做的好处很明显:
- 体积极小:不需要额外捆绑浏览器依赖;
- 原生外观:窗口样式与系统应用保持一致;
- 性能更优:无需加载完整的 Chromium 内核。
关键特性
跨平台支持
它覆盖了主流的桌面系统,对嵌入式 Linux 也很友好(前提是具备 X11 或 Wayland 图形环境):
- Windows:默认使用 Edge (WebView2),同时也兼容 IE11(可选);
- macOS:调用系统 WebKit(Safari 内核);
- Linux:默认使用 GTK+3 + WebKit2GTK,也可以选 Qt WebEngine(需安装 PyQt5/PySide2)。
双向通信能力
这是 PyWebView 最核心的价值之一——让 Web UI 和 Python 后端无缝交互:
- Python 暴露 API 给 JS:通过
js_api参数传递 Python 对象或类,JS 端可以通过window.pywebview.api调用; - Python 调用 JS:使用
window.evaluate_js()执行 JS 代码并获取返回值; - JS 回调 Python:支持异步调用(如
async/await),适合处理复杂的交互场景。
轻量与原生体验
不捆绑浏览器意味着启动速度快,窗口标题栏、边框、图标都遵循系统规范,还能支持菜单、拖放、打印等系统级特性。
现代 Web 支持
兼容 HTML5、CSS3 和 ES6+,你可以集成 Vue、React 或 Angular 等前端框架,或者使用 QML 风格的 Web 组件。
实战示例
基础用法:加载网页
最简单的用法就是创建一个窗口,加载远程 URL 或本地 HTML 文件。
import webview
# 创建窗口,加载远程 URL 或本地 HTML 文件(file:// 开头)
window = webview.create_window(
title='PyWebView Demo',
url='https://pywebview.flowrl.com/', # 远程网页
# url='file:///path/to/local.html', # 本地 HTML
width=800,
height=600,
resizable=True
)
# 启动应用(阻塞式,直到窗口关闭)
webview.start()
双向通信实战
Python 端(暴露 API)
我们需要定义一个类,把方法暴露给 JS 调用。
import webview
class PythonAPI:
def greet(self, name):
"""JS 调用的 Python 方法"""
return f"Hello, {name}! (from Python)"
def show_alert(self, message):
"""Python 主动调用 JS 弹窗"""
window.evaluate_js(f'alert("{message}")')
# 创建窗口时绑定 API
window = webview.create_window(
'API Demo',
url='index.html', # 本地 HTML 文件
js_api=PythonAPI() # 暴露给 JS 的对象
)
webview.start()
JS 端(index.html)
在 HTML 中,你可以通过 window.pywebview.api 访问刚才定义的 Python 对象。
<!DOCTYPE html>
<html>
<body>
<input type="text" placeholder="Enter your name">
<button onclick="callPythonGreet()">Call Python Greet</button>
<button onclick="callPythonAlert()">Call Python Alert</button>
<script>
// 调用 Python 的 greet 方法(异步)
async function callPythonGreet() {
const name = document.getElementById('name').value;
const result = await window.pywebview.api.greet(name);
alert(result);
}
// 调用 Python 的 show_alert 方法(同步)
function callPythonAlert() {
window.pywebview.api.show_alert('Hi from JS!');
}
</script>
</body>
</html>
安装与依赖
通用安装很简单:
pip install pywebview
Linux 额外依赖(GTK+ 后端):
- Ubuntu/Debian:
sudo apt-get install python3-gi python3-gi-cairo gir1.2-webkit2-4.0 - Fedora:
sudo dnf install python3-gobject gtk3 webkit2gtk3
Qt 后端(可选):需先安装 PyQt5 或 PySide2,再用 pip install pywebview[qt]。
适用场景与优缺点
适合做什么?
- 快速构建桌面 UI:配置界面、监控面板等工具类应用;
- 嵌入式 Linux GUI:在带屏设备(工业平板、智能终端)上用 Web 做灵活 UI,Python 处理逻辑;
- 混合应用开发:结合 Flask/Django 做本地服务器,PyWebView 加载
http://localhost:5000作为 UI; - 原型验证:快速将 Web 原型转为桌面应用,无需学习 Qt/Cocoa 等原生框架。
优点
- 门槛低,熟悉的 Web 技术即可上手;
- 轻量,内存占用远低于 Electron;
- 原生体验好,窗口、字体、交互符合系统规范;
- 灵活,支持前端框架、双向通信及自定义样式。
缺点
- WebView 版本依赖系统:旧系统(如 Windows 7 无 Edge)可能受限于 IE,兼容性稍弱;
- 高级特性需手动适配:如硬件加速、离线缓存(需结合 Service Worker);
- 嵌入式 Linux 需图形环境:无 X11/Wayland 时无法运行。
总的来说,PyWebView 是'Web UI + Python 后端'模式的轻量桥梁,既发挥了 Web 的灵活性,又保留了 Python 的高效。如果你想快速把 Web 原型变成桌面应用,它是个不错的选择。
官方文档:https://pywebview.flowrl.com/ GitHub:https://github.com/r0x0r/pywebview

