pywebview:用Python+Web技术打造轻量级桌面应用!

pywebview:用Python+Web技术打造轻量级桌面应用!
✍️作者:唐叔在学习
💡专栏:唐叔学python
关键词Python桌面开发pywebview教程WebView应用前后端分离JS与Python交互桌面应用打包Electron替代方案Python GUI

大家好,我是唐叔。今天我们来聊聊一个非常轻量且强大的Python库——pywebview。如果你曾经为开发一个简单的桌面应用而纠结于Electron的笨重、PyQt的复杂,或是Tkinter的界面简陋,那pywebview或许正是你一直在找的解决方案。

文章目录

一、介绍

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 defmain(): 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 classApi:defget_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中):

<!DOCTYPEhtml><html><body><buttononClick="greet()">打招呼</button></body><script>functiongreet(){ pywebview.api.get_message().then(function(message){alert(message);});}</script></html>
✅ 推荐将Python逻辑封装成API,JS中异步调用,保持前后端分离。

四、应用打包

使用 pyinstaller 打包你的应用:

pyinstaller --onefile --windowed your_script.py 

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

有关 pyinstaller 的介绍,详情请查阅唐叔的这篇文章:告别Python环境依赖!用PyInstaller打包EXE的终极指南_python打包成exe-ZEEKLOG博客

五、常见使用场景

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 defon_drag(e):passdefon_drop(e): files = e['dataTransfer']['files']iflen(files)==0:returnprint(f'事件类型: {e["type"]}。被拖入的文件:')forfilein files:print(file.get('pywebviewFullPath'))defbind(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 defchange_active_window_content(): active_window = webview.active_window()if active_window: active_window.load_html('<h1>You changed this window!</h1>')defclick_me(): active_window = webview.active_window()if active_window: active_window.load_html('<h1>You clicked me!</h1>')defdo_nothing():passdefsay_this_is_window_2(): active_window = webview.active_window()if active_window: active_window.load_html('<h1>This is window 2</h2>')defopen_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 在我多个中小项目中表现出色,尤其是在快速原型和内部工具开发中。希望这篇指南能帮你少走弯路,早日打造出属于自己的桌面应用!

如果有新的想法,欢迎在评论区留言,我们一起交流进步!🎉


参考资料

Read more

IDEA 插件 Trae AI 全攻略

在 Java 开发的日常中,你是否经常遇到这些场景:     面对重复的 CRUD 代码,机械敲击键盘却内心抗拒?     接手 legacy 系统,看着几百行的复杂逻辑无从下手?     调试时卡在某个异常,翻遍文档和 Stack Overflow 却找不到答案?     写单元测试时,明明功能简单却要耗费大量时间设计测试用例? 这些问题的核心,在于重复性工作占用了太多创造性时间。而随着 AI 技术的发展,AI 辅助开发工具已成为突破效率瓶颈的关键。在众多工具中,Trae AI作为 IDEA 的一款插件,凭借对 Java 生态的深度适配、与 IDE 的无缝集成以及强大的代码理解能力,逐渐成为开发者的 “编码搭子”。 本文将从基础到进阶,全面讲解 Trae AI 的功能、用法、实战技巧和最佳实践,帮你彻底释放 AI 辅助开发的潜力,让编码效率提升

VSCode配置 AI agent skills 详细步骤

VSCode配置 AI agent skills 详细步骤

在VS Code中配置“Agent Skills”,是为你的AI编程助手(如GitHub Copilot)定制可复用的专业能力包。你可以把它理解为教你助手如何执行特定任务的标准说明书 它主要由一个 SKILL.md 文件以及相关的脚本、示例组成。当你的需求与某个技能描述匹配时,Copilot会自动加载这个“技能包”来更精准地帮你完成任务,比如创建测试、调试工作流等 启用功能 技能创建位置 在项目根目录或个人配置文件夹中,创建一个特定的文件夹来存放你的技能包 * 项目技能:在项目根目录创建 .github/skills/ 目录。就会作用于项目 * 个人技能:在你电脑用户目录下创建 ~/.copilot/skills/(推荐)或 ~/.claude/skills/。作用于你电脑里所有的项目 技能编写规范 my-skill/ (技能文件夹) ├── SKILL.md # 必需:核心入口文件,包含元数据和主要指令 ‼️‼️‼️ ├── references/ 或 resources/

AI调参技巧:贝叶斯优化Optuna

AI调参技巧:贝叶斯优化Optuna

AI调参技巧:贝叶斯优化Optuna 📝 本章学习目标:本章聚焦性能优化,帮助读者提升模型效率。通过本章学习,你将全面掌握"AI调参技巧:贝叶斯优化Optuna"这一核心主题。 一、引言:为什么这个话题如此重要 在人工智能快速发展的今天,AI调参技巧:贝叶斯优化Optuna已经成为每个AI从业者必须掌握的核心技能。Python作为AI开发的主流语言,其丰富的生态系统和简洁的语法使其成为机器学习和深度学习的首选工具。 1.1 背景与意义 💡 核心认知:Python在AI领域的统治地位并非偶然。其简洁的语法、丰富的库生态、活跃的社区支持,使其成为AI开发的不二之选。掌握Python AI技术栈,是进入AI行业的必经之路。 从NumPy的高效数组运算,到TensorFlow和PyTorch的深度学习框架,Python已经构建了完整的AI开发生态。据统计,超过90%的AI项目使用Python作为主要开发语言,AI岗位的招聘要求中Python几乎是标配。 1.2 本章结构概览 为了帮助读者系统性地掌握本章内容,我将从以下几个维度展开: 📊 概念解析 → 原理推导 → 代

黄仁勋力荐:OpenClaw不止是下一个ChatGPT,更是AI“动手时代”的破局者

黄仁勋力荐:OpenClaw不止是下一个ChatGPT,更是AI“动手时代”的破局者

在2026年GTC大会上,英伟达创始人兼CEO黄仁勋抛出了一个振聋发聩的判断:“OpenClaw绝对是下一个ChatGPT”。 这一评价并非夸大其词,而是精准点出了AI产业的核心演进方向——从“被动回答”的语言交互,转向“主动行动”的任务执行。ChatGPT开启了大语言模型(LLM)的普及时代,让AI具备了理解和生成人类语言的能力,但它始终停留在“军师”的角色,只能提供方案建议;而OpenClaw的出现,彻底打破了这一局限,将AI变成了能动手干活的“数字员工”,完成了AI从“认知”到“执行”的关键跃迁,成为连接AI能力与现实场景的核心桥梁。 下面我将从技术本质出发,拆解OpenClaw的核心架构、关键技术实现,结合代码示例、架构图与流程图,深入解析其如何实现“行动型AI”的突破,以及为何能被黄仁勋寄予厚望,成为AI产业的下一个里程碑。 一、认知跃迁:从“回答型AI”到“行动型AI”的本质区别 要理解OpenClaw的价值,首先需要明确它与ChatGPT这类“回答型AI”的核心差异。