跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python大前端

pywebview:用 Python 和 Web 技术构建轻量级桌面应用

pywebview 是一个轻量级跨平台 Python 库,允许在原生窗口中嵌入 Web 技术(HTML/CSS/JS)构建 GUI 界面。相比 Electron 或 PyQt,它体积更小、开发更便捷。安装方式(全量或指定后端)、基本使用(网络服务架构与无服务器架构)、JS 与 Python 交互方法、应用打包(PyInstaller)以及文件操作、自定义菜单、图标设置等常见场景。适合已有 Web 前端项目快速封装为桌面应用,或对应用体积和内存占用有要求的开发者。

狂少发布于 2026/4/5更新于 2026/5/2326 浏览
pywebview:用 Python 和 Web 技术构建轻量级桌面应用

一、介绍

pywebview 是一个轻量级的跨平台 Python 库,它允许你在一个原生窗口中嵌入 Web 技术(HTML/CSS/JS)来构建 GUI 界面。本质上,它就是一个迷你浏览器内核,让你可以用写网页的方式写桌面应用。

与其他桌面框架对比:

  • Electron:功能强大,但打包体积大、内存占用高。
  • PyQt/Tkinter:原生控件,但界面现代化程度低、开发效率不高。
  • pywebview:轻量、跨平台、易上手,适合快速开发中小型桌面应用,尤其是已有 Web 前端的项目。

二、安装

安装全量版本
pip install pywebview 
安装指定环境版本

如果你希望控制依赖版本,可以使用:

pip install pywebview[qt] # 使用 Qt 后端
pip install pywebview[cef] # 使用 CEF 后端

三、使用入门

3.1 基本使用

来看一个最简单的例子:

import webview

def main():
    window = webview.create_window('Hello pywebview', 'https://pywebview.flowrl.com')
    webview.start()

if __name__ == '__main__':
    main()

函数说明:

  • create_window():创建窗口,参数包括标题和初始 URL 或本地 HTML 路径。
  • start():启动 GUI 事件循环。

文章配图

3.2 应用程序架构
纯网络服务架构

就如上文的基本使用,前端只需暴露应用服务器,后端调用即可。

import webview

if __name__ == '__main__':
    webview.create_window("My App", "http://localhost:3000")
    webview.start(http_server=True, port=3000)

官网有完整的示例 基于 Flask 的应用程序 供参考学习。

无服务器架构

完全不使用网络服务器,通过 webview.create_window(...html='') 或者 window.load_html 加载 HTML。

import webview

html='''
<!DOCTYPE html>
<html>
<body>
<h1>Hello from HTML!</h1>
</body>
</html>
'''

webview.create_window("Local App", html=html)
webview.start()

文章配图

根据官网说明:这种方法有一些限制,因为在加载的页面上下文中没有文件系统。图片和其他资源只能通过 Base64 内联加载。

3.3 JS 与 Python 交互

pywebview 支持在 JS 中调用 Python 函数,也支持在 Python 中调用 JS 方法。

下述是 JS 中调用 Python 函数的代码示例:

Python 端:

import webview

class Api:
    def get_message(self):
        return "Hello from Python!"

if __name__ == '__main__':
    api = Api()
    window = webview.create_window('JS 接口 示例', 'index.html', js_api=api)
    webview.start()

JS 端(在 HTML 中):

<!DOCTYPE html>
<html>
<body>
<button onClick="greet()">打招呼</button>
</body>
<script>
function greet() {
    pywebview.api.get_message().then(function(message) {
        alert(message);
    });
}
</script>
</html>

文章配图

✅ 推荐将 Python 逻辑封装成 API,JS 中异步调用,保持前后端分离。

四、应用打包

使用 pyinstaller 打包你的应用:

pyinstaller --onefile --windowed your_script.py 

打包后会生成一个独立的可执行文件,可在没有 Python 环境的机器上运行。

五、常见使用场景

5.1 文件操作
文件下载

你可以使用 Python 控制文件下载路径,或由前端触发下载。

import webview

if __name__ == '__main__':
    # 创建一个标准的 webview 窗口
    webview.settings['ALLOW_DOWNLOADS'] = True
    window = webview.create_window('Simple browser', 'https://pywebview.idepy.com/download')
    webview.start()
文件拖放

下述是常见的文件拖放效果,实际上是通过拖放后获取到文件路径,进而通过文件路径调用相关 API 再进一步操作文件。

import webview
from webview.dom import DOMEventHandler

def on_drag(e):
    pass

def on_drop(e):
    files = e['dataTransfer']['files']
    if len(files) == 0:
        return
    print(f'事件类型:{e["type"]}。被拖入的文件:')
    for file in files:
        print(file.get('pywebviewFullPath'))

def bind(window):
    window.dom.document.events.dragenter += DOMEventHandler(on_drag, True, True)
    window.dom.document.events.dragstart += DOMEventHandler(on_drag, True, True)
    window.dom.document.events.dragover += DOMEventHandler(on_drag, True, True, debounce=500)
    window.dom.document.events.drop += DOMEventHandler(on_drop, True, True)

if __name__ == '__main__':
    window = webview.create_window('拖放示例', html='''
    <html>
    <body>
    <h1>将文件拖放到此处</h1>
    </body>
    </html>
    ''')
    webview.start(bind, window)
5.2 自定义菜单

pywebview 支持自定义系统菜单:

import webview
import webview.menu as wm

def change_active_window_content():
    active_window = webview.active_window()
    if active_window:
        active_window.load_html('<h1>You changed this window!</h1>')

def click_me():
    active_window = webview.active_window()
    if active_window:
        active_window.load_html('<h1>You clicked me!</h1>')

def do_nothing():
    pass

def say_this_is_window_2():
    active_window = webview.active_window()
    if active_window:
        active_window.load_html('<h1>This is window 2</h2>')

def open_file_dialog():
    active_window = webview.active_window()
    active_window.create_file_dialog(webview.SAVE_DIALOG, directory='/', save_filename='test.file')

if __name__ == '__main__':
    window_1 = webview.create_window('Application Menu Example', 'https://pywebview.idepy.com/hello')
    window_2 = webview.create_window('Another Window', html='<h1>Another window to test application menu</h1>')
    menu_items = [
        wm.Menu('Test Menu', [
            wm.MenuAction('Change Active Window Content', change_active_window_content),
            wm.MenuSeparator(),
            wm.Menu('Random', [
                wm.MenuAction('Click Me', click_me),
                wm.MenuAction('File Dialog', open_file_dialog),
            ]),
        ]),
        wm.Menu('Nothing Here', [wm.MenuAction('This will do nothing', do_nothing)]),
    ]
    webview.start(menu=menu_items)

💡 你也可以完全用 HTML+CSS 在前端构建菜单,更灵活美观。

5.3 图标设置

使用 webview.start(icon=<file_path>) 设置窗口图标。

import webview

if __name__ == '__main__':
    window = webview.create_window('Set window icon', 'https://pywebview.idepy.com/hello')
    webview.start(icon='../logo/logo.png')

此方法仅在 GTK 和 QT 平台上受支持。其他平台的图标将在冻结过程中设置。

六、总结

pywebview 是一个非常灵活且强大的工具,尤其适合:

  • 已有 Web 前端,想快速封装成桌面应用;
  • 希望用 HTML/CSS/JS 构建现代化界面;
  • 对应用体积和内存占用有要求的场景;
  • 需要跨平台运行(Windows/macOS/Linux)。

它的学习曲线平缓,社区活跃,文档完善,是 Python 开发者进军桌面应用开发的绝佳选择。

如果你正在寻找一个轻量、高效、易扩展的桌面开发方案,不妨试试 pywebview,相信它会给你带来惊喜。


参考资料

  • 使用方法 | pywebview 中文文档
  • 应用程序架构 | pywebview 中文文档
  • 下载功能 | pywebview 中文文档
  • 拖放 | pywebview 中文文档
  • 菜单 | pywebview 中文文档

目录

  1. 一、介绍
  2. 二、安装
  3. 安装全量版本
  4. 安装指定环境版本
  5. 三、使用入门
  6. 3.1 基本使用
  7. 3.2 应用程序架构
  8. 纯网络服务架构
  9. 无服务器架构
  10. 3.3 JS 与 Python 交互
  11. 四、应用打包
  12. 五、常见使用场景
  13. 5.1 文件操作
  14. 文件下载
  15. 文件拖放
  16. 5.2 自定义菜单
  17. 5.3 图标设置
  18. 六、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Windows 系统下 Git 安装与配置指南
  • 华为 Eve 高效多模态视觉语言模型技术解析
  • AI 技术前沿动态:Ouroboros、CoPaw、Claude 与 Cursor 更新
  • GLM-5 代码生成能力深度评测与实战体验
  • 用 AI 给老照片上色:算法对比与调参技巧
  • Python 学习资源推荐:Real Python 平台使用指南
  • 小米智能家居Home Assistant接入教程:本地控制与设备兼容问题全解
  • 位运算算法核心技巧与经典例题解析
  • Python 大麦网抢票脚本全解析:从原理到实战
  • Mac Mini M4 本地 AI 模型实战:从 Ollama 到 Stable Diffusion 配置指南
  • MySQL 常用命令速查表
  • Chroma + Ollama + Llama 3.1 搭建本地知识库
  • OpenClaw 跨平台安装指南:Windows、macOS 与 Linux
  • WebPShop 插件指南:在 Photoshop 中完美支持 WebP 格式
  • C++ 红黑树进阶:手撕 STL 源码实现 map 和 set
  • VTJ.PRO 2.0 深度解析:从低代码到 AI 智能体
  • 堆排序与 TopK 问题实战解析
  • MISRA C++静态分析报告解读与实战指南
  • Ollama 集成 Llama 3.2 Vision 与视觉 RAG 系统实战
  • MCP AI Copilot 高并发场景下响应延迟瓶颈及突破方案

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online