桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载pywebview 是一个轻量级的跨平台原生 WebView 封装库让你用纯 Python 配合 JavaScript、HTML 与 CSS 构建桌面应用而底层窗口却由各操作系统的原生 GUI 框架驱动。本文以仓库 docs/guide/README.md官方 Guide 的 Introduction为骨架结合 webview/init.py、webview/guilib.py 等源码实现带你从零安装、写出第一个窗口并掌握平台渲染器选择、内置 HTTP 服务器、JS↔Python 双向通信等核心能力最终可以独立规划并搭建一个桌面 GUI 项目。什么是 pywebviewpywebview是一个轻量级的原生 WebView 封装库native webview wrapper它允许你在自己的原生 GUI 窗口中显示 HTML 内容。它的核心设计理念是把 Web 技术的能力带进桌面应用同时对外隐藏“GUI 基于浏览器”这一事实——你的用户看到的是一个地道的桌面窗口而不是一个浏览器外壳。官方在 webview/init.py 中同样将其定位为pywebview is a lightweight cross-platform wrapper around a webview component that allows to display HTML content in its own dedicated window. Works on Windows, OS X, Linux and Android.具体来说pywebview开箱即用ships with的能力包括内置 HTTP 服务器built-in HTTP server用于以本地服务器方式提供静态资源免去手动起服务的麻烦Python 侧 DOM 支持可以在 Python 中直接创建、遍历、修改页面元素、订阅 DOM 事件窗口管理功能创建、移动、缩放、隐藏、全屏、置顶、最小化/最大化等一系列窗口操作事件系统窗口生命周期加载、显示、关闭、移动、缩放等事件原生 GUI 元素应用菜单Menu以及打开文件、保存文件、确认对话框等原生对话框JavaScript ↔ Python 双向通信既能从 Python 执行 JavaScript也能从 JavaScript 调用 Python 函数JS API bridge。平台与原生后端pywebview支持Windows、macOS、LinuxGTK 或 QT以及 Android。它在每个平台使用操作系统原生的 GUI 来创建承载 Web 组件的窗口Windows 使用WinFormsmacOS 使用CocoaLinux 使用QT 或 GTKAndroid 使用 Kivy见 webview/guilib.py 中的import_android与 webview/platforms/android正因为 GUI 与 Web 渲染组件都由系统提供如果你选择将应用冻结freeze即打包成独立可执行文件pywebview不会随应用捆绑笨重的 GUI 工具包或 Web 渲染器因此打包后的可执行文件体积可以保持很小——这是它相较于直接捆绑 Chromium/Electron 类方案的核心差异点。渲染器Web Engine不同平台背后使用的是不同的 Web 渲染引擎官方文档 docs/guide/web_engine.md 中有完整的对照表平台代码值Code渲染器提供方浏览器兼容性Android—WebKit—Ever-green ChromiumGTKgtkWebKitWebKit2最低版本 2.2—macOS—WebKitWebKit.WKWebView系统内置—QTqtWebKitQtWebEngine / QtWebKit—WindowsedgechromiumChromium .NET Framework 4.6.2 且已安装 Edge RuntimeEver-green ChromiumWindowscefCEFCEF PythonChrome 66WindowsmshtmlMSHTML已废弃Internet Explorer MSHTMLIE11Windows 10/8/7在 Windows 上渲染器的默认选择顺序是edgechromium→mshtml其中mshtml是唯一在任何系统上都保证可用的渲染器但使用 Edge Chromium 需要系统已安装 Edge WebView2 Runtime。选择渲染器有两种方式设置环境变量PYWEBVIEW_GUI例如 Linux 上强制使用 QTexport PYWEBVIEW_GUIqt将渲染器代码值传给webview.start(gui...)参数例如 Windows 上使用 CEFimport webview webview.start(guicef)在源码层面webview/guilib.py 定义了合法的 GUI 类型qt、gtk、cef、mshtml、edgechromium、android、cocoa。initialize()的加载逻辑webview/guilib.py值得注意若设置了PYWEBVIEW_GUI且值合法则以它为准在 Linux 上若存在KDE_FULL_SESSION环境变量即 KDE 桌面会默认优先选qt各平台按“强制值优先否则按默认顺序尝试导入”的策略逐个尝试后端macOS 为 Cocoa→QTLinux 为 GTK→QTWindows 为 WinFormspythonnet→QTAndroid 为 Kivy。若全部导入失败会抛出WebViewException提示安装对应依赖。关于各渲染器的已知限制参考 docs/guide/web_engine.md例如 QtWebKit 不支持调试。安装一般情况下一条命令即可完成安装pip install pywebview这会为当前平台安装默认依赖。pywebview要求Python 3.10 或更高版本见 docs/guide/installation.md。按平台的依赖说明Linux显式选择 QT 或 GTK# 安装 GTK 依赖 pip install pywebview[gtk] # 安装 QT 依赖默认安装 PyQt6 pip install pywebview[qt]其他 QT 相关选项还有pywebview[qt5]、pywebview[pyside2]和pywebview[pyside6]。若pip方式安装失败docs/guide/installation.md 还给出了 apt 系命令例如 Debian 系安装 QtWebEnginesudo apt install python3-pyqt5 python3-pyqt5.qtwebengine python3-pyqt5.qtwebchannel libqt5webkit5-devUbuntu 安装 GTK 依赖sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit2-4.1注意 GTK 需要WebKit2 2.22 及以上版本另外从 Ubuntu Disco Dingo 起也可以直接通过apt安装python3-webview/python-pywebview但 apt 源版本通常滞后想保持最新建议用pip。Windowspythonnet需 .NET Framework 4.0——对应 WinForms 后端要使用最新的 Chromium 需要安装 WebView2 Runtime对应edgechromium渲染器使用 CEF 需要 cefpython仅 Windows 可用QT 也可以用于 Windows。macOSPyObjC系统自带 Python 已预装。独立安装的 Python 只需以下子包pyobjc-core、pyobjc-framework-Cocoa、pyobjc-framework-Quartz、pyobjc-framework-WebKit、pyobjc-framework-securitymacOS 同样可以使用 QT。其他可选依赖pywebview[android]—— Android 开发可参考 Kivy 的 Android 打包指南pywebview[cef]—— CEF 渲染器仅 Windowspywebview[ssl]—— 安装cryptography包用于在本地 HTTP 服务器上启用 HTTPSssl参数依赖它见 webview/init.py 中__generate_ssl_cert的 ImportError 提示。第一个应用Hello world安装完成后用最小的代码创建一个窗口并加载一个网址import webview webview.create_window(Hello world, https://pywebview.flowrl.com/) webview.start()运行后你会得到一个标题为 “Hello world”、内容为该页面的原生窗口。这就是官方 Guide 给出的最小可运行示例见 docs/guide/README.md 与 examples/simple_browser.py。create_window 与 start 的角色分工从源码 webview/init.py 可以看到两个顶层函数的分工webview.create_window(title, urlNone, htmlNone, ...)webview/init.py创建一个窗口并返回Window对象实例。窗口参数非常丰富包括width/height默认 800×600、x/y默认居中、resizable、fullscreen、min_size默认 200×100、frameless、on_top、transparent、background_color必须是合法十六进制颜色否则抛出ValueError见 webview/init.py等。窗口在被创建后并不会立刻显示——只有进入 GUI 循环start后才会显示若在 GUI 循环已启动的情况下再调用create_window新窗口会立即显示。webview.start(funcNone, argsNone, guiNone, debugFalse, http_serverFalse, ...)webview/init.py启动 GUI 循环并显示先前创建的窗口。该函数必须在主线程调用——源码中对此有显式校验若当前线程不是MainThread会抛出WebViewException(pywebview must be run on a main thread.)webview/init.py若在调用start之前一个窗口都没有创建同样会抛出WebViewException(You must create a window first before calling this function.)webview/init.py。多窗口与活动窗口start会阻塞后续代码直到最后一个窗口被销毁。你可以创建任意多个窗口所有窗口按创建顺序存放在webview.windows列表中要获取当前活动聚焦窗口使用webview.active_window()。下面的示例来自 docs/guide/usage.mdimport webview def handler(): print(fThere are {len(webview.windows)} windows) print(fActive window: {webview.active_window().title}) first_window webview.create_window(pywebview docs, https://pywebview.flowrl.com) second_window webview.create_window(Woah dude!, https://woot.fi) second_window.events.shown handler webview.start()active_window()的实现在 webview/init.py它委托给当前 GUI 后端的get_active_window()screens属性则返回显示器列表首个为主显示器可用于把窗口定位到指定屏幕webview/init.py。构建应用几种典型的架构方式官方 Guide 在 docs/guide/architecture.md 中归纳了三种构建应用的方式规划项目前可以先选定其一1. 纯 Web 服务器指向 URL最简单的场景是直接指向一个 URL——无论是远程网站还是本地运行的服务webview.create_window(Simple browser, https://pywebview.flowrl.com) webview.start()如果指向本地 Web 服务器可以在后台线程手动启动外部 HTTP 服务器或者直接把一个 WSGI 服务器实例传给url参数server Flask(__name__, static_folder., template_folder.) webview.create_window(My first pywebview application, server) webview.start()完整示例见 examples/flask_app一个 Flask 后端 WebView 前端的项目。使用本地 Web 服务器时应针对 API 调用做好 CSRF 防护参考 docs/guide/security.md。官方同时提醒虽然file://协议可用但由于其固有局限且渲染器支持不佳不推荐。2. JS API 内置 HTTP 服务器无服务端另一种方式是使用 JS API 桥接JS API bridge并用内置 HTTP 服务器提供静态内容。JS API 桥接允许 Python 与 JavaScript 域在没有 Web 服务器的情况下直接通信。桥接可通过create_window(..., js_apiApi())或window.expose(func)建立只要把入口 URL 指向一个本地相对路径内置 HTTP 服务器就会自动启动。完整实现见 examples/todos一个 serverless 风格的待办应用前端在 examples/todos/assets后端逻辑在 examples/todos/main.py。3. 纯 Serverless无 Web 服务器最后一种方式完全不需要 Web 服务器用webview.create_window(...html)或window.load_html()直接加载 HTML 字符串。这种方式的限制是页面上下文里不存在文件系统图片等资源只能用 Base64 内联加载import webview webview.create_window(Woah dude!, htmlh1Woah dude!/h1) webview.start()内置 HTTP 服务器与 WSGI 集成pywebview内部使用 bottle.py。以下关键行为在 docs/guide/usage.md 的 HTTP server 一节有明确说明对于相对路径的本地文件HTTP 服务器会自动启动入口文件所在目录作为服务器根目录其下所有内容都会被共享通过webview.start(sslTrue)可以为内置服务器启用 SSL需要cryptography包源码会自动生成自签名证书见 webview/init.py 与__generate_ssl_cert若希望使用外部 WSGI 兼容服务器直接把服务器应用对象作为 URL 传入即可如上面的 Flask 示例若确实想用file://协议免服务器加载可以传绝对路径或file://前缀但官方不推荐这样做不利于分发且受渲染器处理限制。import webview # 相对路径内置 HTTP 服务器自动启动并托管 src/ 目录 webview.create_window(Woah dude!, src/index.html) webview.start(sslTrue)JS ↔ Python 双向通信这是pywebview最具价值的特性之一官方文档 docs/guide/interdomain.md 与 API 文档docs/api/README.md有完整说明。从 Python 运行 JavaScriptwindow.evaluate_js(code, callbackNone)执行任意 JavaScript 代码并同步返回最后一行表达式的值若提供callback则 Promise 会被解析回调以结果作为参数被调用JS 类型会自动转换JS 对象 → Pythondict数组 →listundefined→NoneDOM 节点使用自定义序列化函数会被省略循环引用转为字符串[Circular Reference]若执行的代码抛出错误在 Python 侧会重新抛出为webview.errors.JavascriptExceptionevaluate_js内部把代码包进 helper 并用eval执行因此会受 CSP 的unsafe-eval限制——这种场景下改用window.run_js(code)它原样执行 JS、不返回结果也不处理异常。参考示例examples/evaluate_js.py、examples/run_js.py。从 JavaScript 运行 Python有两种机制js_api 参数把 Python 类的实例传给create_window(url, js_apiapi_instance)。类的所有可调用方法会被暴露为 JS 域的window.pywebview.api.funcName。规则方法名不能以下划线开头嵌套类会转换成嵌套对象_serializable False的嵌套类会被省略。window.expose(func)在运行时暴露单个函数同样挂载到pywebview.api.func_name。若与 JS API 名字冲突expose的函数优先。import webview class Api(): def log(self, value): print(value) webview.create_window(Test, htmlbutton onclickpywebview.api.log(\Woah dude!\)Click me/button, js_apiApi()) webview.start()注意pywebview.api不保证在window.onload时可用应订阅window.pywebviewready事件以确保 JS API 已就绪。暴露的函数返回 Promise成功解析为返回值异常被封装进 JSError对象可通过error.stack查看堆栈且它们在独立线程中执行、不是线程安全的。共享状态Shared state6.0 新增数据可以通过 Python 侧Window.state与 JS 侧pywebview.state两个对象共享在任意一侧修改顶层属性都会自动同步到另一侧。例如 Python 中执行window.state.hello worldJS 侧pywebview.state.hello就会更新。注意只传播顶层修改——如果你改的是一个可变对象的内部字段另一侧不会感知状态是窗口级的且页面重新加载后依然保留二进制数据需先转成 Base64 之类可序列化形式状态变更会触发事件Python 侧pywebview.state lambda event_type, key, value: ...event_type为change或deleteJS 侧用pywebview.state.addEventListener(change/delete, ...)变更数据在event.detail中。Window 对象常用方法速查Window对象提供了大量窗口交互方法docs/api/README.md 给出了完整清单。以下是最常用的部分摘录自 docs/guide/usage.mdwindow.load_url(url)在窗口中加载新 URLwindow.load_html(content)直接把 HTML 内容加载进窗口window.evaluate_js(script)执行 JavaScript 并返回结果window.toggle_fullscreen()在全屏/窗口模式间切换window.resize(width, height)调整窗口尺寸window.move(x, y)移动窗口window.hide()/window.show()隐藏/显示窗口window.minimize()/window.restore()最小化/还原窗口window.destroy()销毁关闭窗口其他值得一提的能力window.create_file_dialog(dialog_typewebview.FileDialog.OPEN, ...)打开文件/文件夹/保存对话框旧常量OPEN_DIALOG/FOLDER_DIALOG/SAVE_DIALOG已弃用改用FileDialog枚举见 webview/init.pywindow.get_cookies()/window.clear_cookies()Cookie 读取与清理window.native获取原生窗口对象System.Windows.Form/AppKit.NSWindow/Gtk.ApplicationWindow/QMainWindow等用于自定义样式before_show事件之后才可用window.load_css(css)以字符串加载 CSSwindow.state上文提到的共享状态对象。Window 事件系统Window对象的窗口管理与导航事件全部挂在window.events容器下官方 docs/guide/usage.md 列出的有closed、closing、loaded、before_load、before_show、shown、minimized、maximized、restored、resized、moved。订阅使用退订使用-import webview def on_closing(): print(Window is about to close) window webview.create_window(Woah dude!, https://pywebview.flowrl.com) window.events.closing on_closing webview.start()事件机制的底层实现见 webview/event.pyEvent类维护一个回调列表__add__/__sub__/__iadd__/__isub__运算符重载实现了/-语法set()会根据事件的should_lock标志决定同步执行还是在新线程中异步执行——这也印证了 API 文档中的说明before_show、before_load、initialized是阻塞的其余事件异步、在独立线程中触发。若事件处理器返回False某些事件如closing可以取消对应操作。DOM 支持5.0 起从 5.0 版本开始pywebview支持基础的 DOM 操作、遍历与 DOM 事件可以在 Python 侧直接操作页面相关示例见 examples/dom_events.py、examples/dom_manipulation.py、examples/dom_traversal.py。官方 docs/guide/dom.md 给出完整用法这里摘录核心能力创建与获取元素element window.dom.create_element(divnew element/div) element window.dom.create_element(h1Warning/h1, parent#container, modeManipulationMode.FirstChild) element window.dom.get_element(#element-id) # 返回第一个匹配元素或 None elements window.dom.get_elements(div) # 返回匹配元素列表读取/修改元素属性element.id、element.classes类列表支持add/remove/toggle、element.style类 dict支持赋值与置 None 重置、element.tabindex、element.tag、element.text、element.value、element.attributes。操作与遍历element.copy()、element.move(target)、element.remove()、element.empty()、element.append(html, mode...)、element.children、element.next、element.parent、element.previousbody、document、window可直接通过window.dom.body/window.dom.document/window.dom.window访问。可见性与焦点element.hide()/element.show()/element.toggle()/element.visibleelement.focus()/element.blur()/element.focused。DOM 事件可直接在 Python 中订阅element.on(click, print_handler) element.events.click shout_handler # 两种订阅方式等价 element.off(click, print_handler) element.events.click - shout_handler # 两种退订方式等价webview.dom.DOMEventHandler可精确控制事件行为设置prevent_default、stop_propagation、stop_immediate_propagation以及debounce毫秒级防抖适用于dragover、mouseover这类高频事件。此外pywebview增强了drop事件可以拿到被拖放文件的完整路径window.dom.document.events.drop lambda e: print(e[domTransfer][files][0])调试官方调试指南见 docs/guide/debugging.md核心要点在webview.start(debugTrue)中启用调试可打开 Web InspectormacOS、GTK 以及 QTWebEngine。macOS 上右键页面选择 Inspect若不想自动打开 DevTools在调用webview.start()之前设置webview.settings[OPEN_DEVTOOLS_IN_DEBUG] Falseedgechromium与qt渲染器支持远程调试设置webview.settings[REMOTE_DEBUGGING_PORT]为端口号即可MSHTML 无法附加外部调试器debug标志仅启用 JS 错误报告与右键菜单为pywebview自身开启调试日志启动应用前设置环境变量PYWEBVIEW_LOGdebug源码 webview/init.py 中的_setup_logger会读取该变量并校验取值非法值回退到 INFOAndroid 上 Python 代码无法附加调试器只能通过adb -s DEVICE_ID logcat | grep python查看日志前端代码可用 WebView 远程调试。深入了解文档与示例地图API 参考docs/api/README.md——覆盖webview.create_window/webview.start全参数、webview.settings全局设置项如ALLOW_DOWNLOADS、DRAG_REGION_SELECTOR、DEFAULT_HTTP_PORT、JS_API_MAX_DEPTH、WEBVIEW2_RUNTIME_PATH等、Window全部方法、Screen显示器属性逻辑像素与physical_*物理像素、scale、dpi、Menu菜单对象以及 JS 侧window.pywebview对象api、platform、token、state使用指南docs/guide/usage.md架构说明docs/guide/architecture.md平台与渲染器docs/guide/web_engine.mdJS-Python 桥接docs/guide/interdomain.mdDOM 支持docs/guide/dom.md示例代码examples——包含简单浏览器、多窗口、全屏、文件对话框、菜单、下载、拖拽、Cookie、Flask 集成examples/flask_app、待办应用examples/todos等几十个可直接运行的单文件示例。参与贡献与支持完整的贡献指南见 docs/contributing/README.md涵盖缺陷报告docs/contributing/bug_reporting.md、开发环境搭建docs/contributing/development.md、文档写作docs/contributing/documentation.md与发版流程docs/contributing/release.md如果你希望支持项目持续发展可参考 docs/contributing/donating.md。小结从官方 Introduction 到源码实现pywebview的核心价值可以概括为用 Web 技术栈写界面、用 Python 写逻辑、用系统原生窗口承载一切。安装pip install pywebview、创建窗口create_window、启动循环start三步即可运行第一个应用在此基础上你可以根据项目形态选择纯 Web 服务器、JS API 内置 HTTP 服务器、或纯 Serverless 三种架构再叠加窗口事件、DOM 操作、双向通信与共享状态等能力快速构建出可打包分发的跨平台桌面应用。动手前建议通读 docs/guide/usage.md 与 docs/api/README.md并结合 examples 中的可运行示例快速验证各种能力。赞分享桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载相关推荐pywebview终极指南10分钟学会用Python构建现代化桌面GUI应用pywebview终极指南10分钟学会用Python构建现代化桌面GUI应用 想要用Python快速构建跨平台桌面应用pywebview让这一切变得简单这桌面应用前端BGE-base-en-v1.5-openmind微调指南如何让模型适应你的特定领域BGE base en v1.5 openmind微调指南如何让模型适应你的特定领域 BGE base en v1.5 openmind是一款强大的开源文本嵌PyDracula GUI框架入门指南5步快速构建现代Python桌面应用PyDracula GUI框架入门指南5步快速构建现代Python桌面应用 PyDracula是一个基于PySide6/PyQt6的现代GUI框架专为Pyt桌面应用UI组件上一篇【亲测免费】 强烈推荐Sketch颜色对比度分析器 —— 让你的设计无障碍下一篇推荐使用CodeQL - 强大的代码安全扫描工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考