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

faster-whisper词级时间戳:从语音到精准定位的完整指南

还在为会议录音中找不到关键决策点而烦恼?想要精确定位视频中某句话的准确时间?faster-whisper的词级时间戳功能正是你需要的解决方案。本文将带你从零开始,全面掌握这项强大的语音定位技术。 【免费下载链接】faster-whisperplotly/plotly.js: 是一个用于创建交互式图形和数据可视化的 JavaScript 库。适合在需要创建交互式图形和数据可视化的网页中使用。特点是提供了一种简单、易用的 API,支持多种图形和数据可视化效果,并且能够自定义图形和数据可视化的行为。 项目地址: https://gitcode.com/gh_mirrors/fa/faster-whisper 什么是词级时间戳? 词级时间戳是faster-whisper提供的一项高级功能,能够在语音转写过程中为每个词语生成精确的起止时间。不同于传统的段落级时间戳,词级时间戳能够实现毫秒级的语音内容定位,让语音检索变得前所未有的精准。 快速上手:三行代码启用词级时间戳 想要体验词级时间戳的强大功能?只需要三行代码: from faster_whisper import Whisp

ComfyUI-Manager终极低配置设备优化指南:10个技巧提升AI绘画效率

ComfyUI-Manager终极低配置设备优化指南:10个技巧提升AI绘画效率 【免费下载链接】ComfyUI-Manager 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-Manager ComfyUI-Manager是专为ComfyUI设计的扩展管理工具,能够高效管理自定义节点的安装、更新和配置。对于低配置设备用户来说,优化ComfyUI-Manager的设置可以显著提升AI绘画工作流的性能和稳定性。本指南将分享10个实用技巧,帮助你在资源有限的设备上获得最佳使用体验。😊 1. 理解ComfyUI-Manager的核心功能与架构 ComfyUI-Manager作为ComfyUI的扩展管理器,提供了完整的自定义节点生态系统管理功能。通过manager_core.py和manager_server.py等核心模块,它实现了节点的自动化安装、依赖管理和版本控制。对于低配置设备,合理配置这些模块的运行参数至关重要。 2. 优化配置文件的性能设置 在config.ini文件中,有几个关键设置可以显著影响低配置设备的性能:

本地部署LLaMA-Factory全指南

本地部署LLaMA-Factory全指南 在大模型技术飞速发展的今天,如何让普通人也能轻松定制属于自己的AI助手?这曾是一个遥不可及的梦想。但随着 LLaMA-Factory 这类开源项目的出现,微调一个大语言模型不再只是顶级实验室的专利。它把复杂的训练流程封装成可点击的操作,甚至不需要写一行代码,就能完成从数据准备到模型部署的全过程。 如果你有一块消费级显卡,比如 RTX 3060 或更高,那么你已经具备了动手实践的基础条件。本文将带你一步步搭建环境、加载模型、配置训练参数,并最终生成一个能理解中文指令的个性化 Qwen 模型——整个过程就像使用图形化软件一样自然流畅。 硬件与环境检查:你的设备准备好了吗? 再强大的框架也离不开硬件支撑。虽然 LLaMA-Factory 支持 CPU 推理,但真正想跑通一次像样的微调任务,GPU 是必不可少的。 打开终端,先执行这条命令: nvidia-smi 如果能看到类似下面的信息,说明你的 NVIDIA 显卡驱动和 CUDA 环境基本正常: +-----------------------------------------

Whisper-large-v3保姆级教程:语音转文字so easy

Whisper-large-v3保姆级教程:语音转文字so easy 1. 引言 1.1 语音识别的实际价值 想象一下这样的场景:你需要整理一场多语言会议的录音,或者想把外语视频的字幕提取出来,又或者需要将语音笔记转为文字。传统方法要么费时费力,要么需要专业软件。现在,有了Whisper-large-v3,这些都能轻松搞定。 这个教程要介绍的镜像,基于OpenAI Whisper Large v3模型,能自动识别99种语言,支持音频上传和实时录音,还有Web界面让你点点鼠标就能用。无论你是开发者还是普通用户,都能快速上手。 1.2 教程能带给你什么 看完这篇教程,你将学会: * 怎么快速部署这个语音识别服务 * 怎么通过Web界面使用各种功能 * 怎么用代码调用API进行二次开发 * 遇到问题怎么解决 最重要的是,整个过程非常简单,不需要深厚的技术背景,跟着步骤做就行。 2. 环境准备与快速部署 2.1 硬件和系统要求 想要顺畅运行这个服务,你的设备最好满足这些条件: 资源类型推荐配置最低要求GPUNVIDIA RTX 4090