使用 pywebview 构建无服务器桌面应用:以 TodoMVC 风格 Todo 应用为例,打通相对 URL 加载与 JS API 双向通信
桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载本文基于 pywebview 仓库中的 examples/todos 示例讲解如何在不启动独立 HTTP 服务器serverless的前提下用 HTML/CSS/JavaScript 构建原生桌面应用通过相对 URL 加载本地页面并通过 JS API 对象实现 Python 与 JavaScript 的双向通信。读完本文你将掌握webview.create_window的本地文件加载、js_api参数注入、webview.windows窗口引用与全屏切换等实战技能并理解其底层的 HTTP 桥接与 Promise 调用机制。示例概览一个相对 URL JS API 的经典组合examples/todos是一个功能完整的 Todo 应用待办事项管理前端代码改编自 MIT 协议下的 TodoMVC 项目examples/todos/README.md中保留了原始版权声明Copyright (c) Addy Osmani, Sindre Sorhus, Pascal Hartig, Stephen Sawchuk。它体现了两点核心设计相对 URL 加载create_window直接传入assets/index.html这样的相对路径而非http://或file://绝对地址由 pywebview 内置服务器自动托管本地静态资源JS API 通信Python 端定义一个Api类并通过js_api参数注入前端在 JavaScript 中以window.pywebview.api.xxx(...)的形式调用 Python 方法。目录结构如下examples/todos/ ├── README.md # 示例说明与 TodoMVC 许可证声明 ├── main.py # Python 入口Api 类 窗口创建 start └── assets/ ├── index.html # 页面骨架TodoMVC 界面 ├── script.js # Store / Model / View / Controller 分层逻辑 ├── styles.css # 界面样式 └── logo.jpg # 页面头部 Logo从入口代码看无服务器架构examples/todos/main.py 全文件不足 30 行却完整展示了 serverless 应用的骨架import webview class Api: def addItem(self, title): print(fAdded item {title}) def removeItem(self, item): print(fRemoved item {item}) def editItem(self, item): print(fEdited item {item}) def toggleItem(self, item): print(fToggled item {item}) def toggleFullscreen(self): webview.windows[0].toggle_fullscreen() if __name__ __main__: api Api() webview.create_window(Todos magnificos, assets/index.html, js_apiapi, min_size(600, 450)) webview.start(sslTrue)核心调用逐行拆解create_window(title, url, js_api, min_size)创建原生窗口。这里url参数传入的是相对路径assets/index.htmlpywebview 会启动内置 Bottle 服务器托管该目录下的静态资源页面内引用的styles.css、script.js、logo.jpg也因此能被正确解析见 examples/todos/assets/index.html 中的link、script与img标签。js_apiapi把Api实例暴露给前端 JavaScript前端即可调用window.pywebview.api.addItem(...)等方法。min_size(600, 450)设置窗口最小尺寸。该参数在 webview/init.py 的create_window签名中默认值为(200, 100)类型为(width, height)二元组。webview.start(sslTrue)启动 GUI 主循环并启用 SSL。从 webview/init.py 的__generate_ssl_cert实现可以看到启用 SSL 需要安装cryptography包pip install pywebview[ssl]pywebview 会现场生成自签名证书keyfile_*.pem/certfile_*.pem证书的 SAN 包含localhost有效期 365 天。webview.windows[0]pywebview 维护全局窗口列表第一个创建的窗口索引为 0这里用于在 API 方法中拿到窗口对象并调用toggle_fullscreen()。该方法定义在 webview/window.py其调用链为Window.toggle_fullscreen - gui.toggle_fullscreen(uid)最终由各平台后端WinForms/Qt/GTK/Cocoa 等实现原生切换。为什么说它是无服务器对比examples/flask_app这类依赖外部 Web 框架的示例todos示例不需要开发者自己启动任何 HTTP 服务——create_window的url参数只接受相对路径或本地路径pywebview 内部会为本地资源自动起一个轻量 HTTP 服务器。相关实现位于 webview/http.pystart_server会计算所有本地 URL 的公共路径os.path.commonpath作为root_path静态文件由/与/file:path路由托管同时注册POST /js_api/{uid}端点用于承接 JavaScript 端发来的 API 调用再通过server.js_callback回调分发到对应的 Python 方法。这意味着应用打包发布时无需依赖外部端口或 Web 服务器进程天然适合 PyInstaller 等方式冻结分发。前端如何调用 PythonJS API 的 Promise 化桥接在前端 examples/todos/assets/script.js 的controller.js部分可以看到 JS API 的实际调用方式self.view.bind(newTodo, function (title) { self.addItem(title); window.pywebview.api.addItem(title) }); self.view.bind(itemEditDone, function (item) { self.editItemSave(item.id, item.title); window.pywebview.api.editItem(item) }); self.view.bind(itemRemove, function (item) { self.removeItem(item.id); window.pywebview.api.removeItem(item) }); self.view.bind(itemToggle, function (item) { self.toggleComplete(item.id, item.completed); window.pywebview.api.toggleItem(item) }); self.view.bind(toggleFullscreen, function () { window.pywebview.api.toggleFullscreen() });可见每个 Todo 操作新增、编辑、删除、勾选、全屏都会触发一次对 Python 的跨语言调用。这里的window.pywebview.api并非手写的全局对象而是由 pywebview 运行时自动注入的。注入与桥接原理注入逻辑在 webview/js/api.js 中window.pywebview._createApi(funcList)接收 Python 端暴露的函数清单函数名 参数列表在window.pywebview.api下为每个函数生成一个new Function(...)包装器每次调用会生成唯一 ID(Math.random() ).substring(2)调用前注册一个 Promise_checkValue(funcName, resolve, reject, __id)负责异步等待 Python 端的返回值随后通过_jsApiCallback(funcName, params, id)把参数序列化并分发到各平台后端mshtml 走window.external.calledgechromium 走chrome.webview.postMessageWithAdditionalObjects其余平台走window.external.call带 token 的形式因此pywebview.api上的每个方法都返回一个 Promise这是前端then(...)语法得以工作的前提。值得注意的是_createApi还做了参数名净化sanitize_params若 Python 方法参数名是 JS 保留字如case、new、function等会自动追加_后缀避免语法错误并且支持通过funcName.split(.)构造嵌套 API 结构——例如 Python 端heavy_stuff.doHeavyStuff会暴露为pywebview.api.heavy_stuff.doHeavyStuff该能力在 examples/js_api.py 中也有完整演示class HeavyStuffAPI被内嵌进Api类成为属性。若你的 Python 方法需要返回值本示例中的addItem等只负责打印日志无需返回值可以让方法return任意 Python 对象pywebview 会将其序列化为 JSON 传回前端 Promise。若需要更精细的桥接控制如显式expose、事件注入、异步取消等可参考 examples/js_api.py 与仓库内更完整的 js_api 指南文档。Todo 应用的前端分层Store / Model / View / Controllerscript.js完整实现了经典 MVC 分层虽然它不直接与 pywebview 相关但理解它有助于看清 JS API 调用点在业务中的位置Storestorage基于window.todoStorage的伪数据库提供find/findAll/save/remove/drop五个方法新增条目时以new Date().getTime()作为自增 IDscript.js 中 store.js 段落Model在 Store 之上封装create/read/update/remove/removeAll/getCount负责业务数据语义model.js 段落Template View用 Underscore 风格微模板生成li列表项封装全部 DOM 读写与事件绑定包括双击编辑、Enter 提交、Esc 取消、全选等交互view.js 段落Controller承接视图事件并协调 Model在每个关键动作处插入window.pywebview.api.*调用实现界面操作 - 本地存储 - 通知 Python的完整链路controller.js 段落。页面结构上index.html 提供了输入框、列表、底部过滤器All / Active / Completed与一个自定义的fullscreen按钮该按钮的事件在 View 的bind(toggleFullscreen, ...)中被拦截最终触发pywebview.api.toggleFullscreen()完成窗口全屏切换——这是示例对 TodoMVC 的 pywebview 化改造亮点之一。运行与验证在已安装 pywebview及其平台依赖的环境中直接运行即可看到效果python examples/todos/main.py预期行为弹出标题为 Todos magnificos 的窗口最小尺寸被限制为 600×450页面通过相对 URL 正常加载 Logo、样式与脚本新增、编辑、删除、勾选 Todo 时Python 控制台分别打印Added item ...、Edited item ...、Removed item ...、Toggled item ...点击页面底部fullscreen按钮窗口切换为全屏/退出全屏。若在无cryptography的环境下运行报错可按提示pip install pywebview[ssl]或把webview.start(sslTrue)改为webview.start()。小结从示例到你自己的无服务器桌面应用examples/todos用 30 行 Python 加一份 TodoMVC 前端展示了 pywebview 无服务器应用的两个支柱能力能力用法底层实现位置相对 URL 加载本地页面create_window(title, assets/index.html, ...)webview/http.py 的 Bottle 静态托管 POST /js_api/{uid}端点Python ⇄ JS 双向调用js_apiapiwindow.pywebview.api.xxx()webview/js/api.js 的_createApiPromise 包装webview/window.py 的expose机制窗口级原生操作webview.windows[0].toggle_fullscreen()webview/window.py → 各平台gui.toggle_fullscreen零依赖静态托管内置服务器自动路由本地资源webview/http.py 的静态文件路由这套模式适合需要桌面壳的本地工具、需要 Python 后端能力但不想维护 Web 服务器的场景、以及后续用 PyInstaller 打包分发的小型应用。更复杂的 JS API 能力返回复杂对象、嵌套 API、异常捕获、线程安全的长任务可以继续研读 examples/js_api.py它演示了init、随机数、异常抛出与可取消重任务等进阶用法与本文示例相互印证共同构成 pywebview JS API 机制的完整实践图谱。赞分享桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载相关推荐pywebview 实战示例全解从无服务器架构到 Flask HTTP 服务构建完整的 Python 桌面应用pywebview 实战示例全解从无服务器架构到 Flask HTTP 服务构建完整的 Python 桌面应用 本文基于 pywebview 仓库的 doc桌面应用前端pywebview与WebSocket集成构建实时通信桌面应用的终极指南pywebview与WebSocket集成构建实时通信桌面应用的终极指南 在现代应用开发中 pywebview 作为一款强大的Python库让开发者能够使桌面应用前端【免费下载】 使用pywebview构建Python桌面应用的Web界面使用pywebview构建Python桌面应用的Web界面 什么是pywebview pywebview是一个轻量级的跨平台工具库它允许开发者使用JavaSc桌面应用前端上一篇终极PhotoSwipe事件系统指南从监听基础到高级自定义技巧下一篇TikiTorch PPID欺骗实战如何隐藏进程父子关系创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TypeORM 官方 playground 实战指南:用 ESM + sql.js 跑通内存版 SQLite 全流程

TypeORM 官方 playground 实战指南:用 ESM + sql.js 跑通内存版 SQLite 全流程

后端数据库ORM 【免费下载链接】typeorm TypeScript & JavaScript ORM for Node.js — supports PostgreSQL, MySQL, MariaDB, SQLite, SQL Server, Oracle, and more. 项目地址: https://gitcode.com/GitHub_Trending/ty/typeorm 点击查看 免费下载 导读 本文…

2026/10/10 11:37:54 阅读更多 →
基于PIC18F56K42与PJ85718DM的HVAC本地/远程双路温度监测实战

基于PIC18F56K42与PJ85718DM的HVAC本地/远程双路温度监测实战

1. 从一颗温度传感器说起:为什么本地与远程双路监测值得单独做嵌入式温度监测这件事,看起来简单,做起来坑不少。很多人第一反应是"挂个传感器读一下不就完了",但真正落到 HVAC(暖通空调)这类场景…

2026/10/10 11:37:54 阅读更多 →
PJ85718DM+MK24FN1M0VDC12双模温控中枢设计

PJ85718DM+MK24FN1M0VDC12双模温控中枢设计

1. 这不是普通温度监控:PJ85718DM MK24FN1M0VDC12 构建的双模温控中枢你有没有遇到过这样的场景:某高校实验室里,一台老式HVAC机组在夏季午后频繁报“局部过热”,但现场用红外测温枪扫一圈,回风箱、冷凝器、压缩机外壳…

2026/10/10 11:37:54 阅读更多 →

最新新闻

Chrome 中运行 Axure 原型:扩展增强与避坑指南

Chrome 中运行 Axure 原型:扩展增强与避坑指南

简介:这是一款面向产品经理、交互设计师与前端开发者的Chrome浏览器扩展资源,用于在浏览器中直接调用Axure RP原型设计相关能力,解决网页元素测量、截图与标注等协作痛点。资源包共8个文件,以png图标资源、js脚本、json配置、html…

2026/10/10 12:31:09 阅读更多 →
SpringBoot微信小程序代驾系统:状态机、实时定位与计费避坑指南

SpringBoot微信小程序代驾系统:状态机、实时定位与计费避坑指南

简介:一份基于Springboot框架与微信小程序开发的代驾系统毕业设计论文,适用于计算机、软件工程等专业的学生用于毕业设计选题参考、论文撰写或项目开发借鉴。论文完整展现了从选题背景、研究现状、需求分析到系统设计、实现与优化的全过程,重…

2026/10/10 12:31:09 阅读更多 →
keelOS:面向用户行为的Linux操作系统适配范式

keelOS:面向用户行为的Linux操作系统适配范式

1. keelOS不是“又一个Linux发行版”,而是操作系统层面的适配哲学第一次看到“keelOS: fnOS, 为了适配你,我做了N多调整!”这个标题时,我下意识点开想看看是不是某个小众桌面发行版的新版本宣传。结果翻遍所有公开渠道——没有ISO…

2026/10/10 12:31:09 阅读更多 →
华为E9000刀片服务器选型与故障排查实战指南

华为E9000刀片服务器选型与故障排查实战指南

简介:本资源为华为FusionServer Pro E9000刀片服务器官方技术白皮书(Data Sheet),面向数据中心架构师、云计算工程师、服务器运维人员及ICT基础设施学习者,用于快速掌握该高端刀片平台的核心规格、模块化设计与多场景适…

2026/10/10 12:31:09 阅读更多 →
SAO-SVR时序预测模型:雪消融算法优化SVR超参数的MATLAB实现

SAO-SVR时序预测模型:雪消融算法优化SVR超参数的MATLAB实现

我在实际项目里做时序预测时,最常用到的套路就是“智能优化算法 传统回归模型”的组合,SAO-SVR就是其中非常典型的一例。SAO(Snow Ablation Optimizer,雪消融优化算法)是近年来提出的元启发式算法,它模拟积…

2026/10/10 12:31:09 阅读更多 →
Spring Boot餐厅点餐系统开发实战:数据模型、订单状态与并发避坑

Spring Boot餐厅点餐系统开发实战:数据模型、订单状态与并发避坑

简介:基于Spring Boot的餐厅点餐管理系统毕业设计论文参考文档,面向需要完成Java方向毕业设计或课程论文的高校学生,解决论文结构规划、技术选型论述与写作表达方面的难题。内容覆盖摘要、目录、绪论、开发环境、需求分析、系统设计等核心章节…

2026/10/10 12:30:08 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →