桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载本文是一份面向 pywebview 贡献者的开发指南围绕 docs/contributing/development.md 展开覆盖从 Fork 仓库、搭建虚拟环境、安装开发依赖到分支协作、代码格式化、测试运行与 Pull Request 提交的完整流程。读完本文你将掌握如何在 pywebview 仓库中高效地修改代码、运行冒烟测试、遵守 Ruff 与 pre-commit 强制的编码规范并理解仓库源码与测试背后约定的实现细节。环境搭建从零开始准备可开发的 pywebview 仓库在动手编写新功能之前请先在 issue 跟踪器中创建一个 issue 并与维护者讨论细节避免方向性返工。这一约定同样写在了 CONTRIBUTING.md 中Before you start work on a new feature, please open an issue to discuss it first.前置条件本文假设你已经具备以下环境一个 GitHub 账号用于 Fork 与发起 Pull RequestPython 3.10 或更新版本——这是 pywebview 的最低支持版本在 pyproject.toml 中以requires-python 3.10明确声明classifiers 中也列出 3.10 至 3.13 的支持范围virtualenv或使用 Python 自带的venv模块gitBash 环境Windows 用户可使用 Git 自带的 Bash。逐步安装步骤Fork pywebview 仓库并克隆你的 Forkgit clone https://github.com/username/pywebview cd pywebview创建并激活虚拟环境virtualenv -p python3 venv source venv/bin/activate以可编辑模式安装开发依赖pip install -e .[dev][dev]是 pyproject.toml 中声明的可选依赖组内容包括ruff、pre-commit、pytest、pytest-timeout、build和twine。-eeditable模式保证你对源码的修改即时生效无需重新安装。注意运行时核心依赖bottle、proxy_tools、typing_extensions以及按平台区分的 pythonnet、PyObjC、PyGObject 等会随主安装一并解析。安装 pre-commit 钩子pre-commit install执行后每次git commit都会自动触发钩子完成 import 排序、代码格式化、大文件检查、尾随空白与 YAML 语法检查并尽可能自动修复问题。运行 Hello World 验证环境python examples/simple_browser.py该示例来自 examples/simple_browser.py其核心只有几行import webview if __name__ __main__: window webview.create_window(Simple browser, https://pywebview.flowrl.com/hello) webview.start()如果能看到一个原生窗口打开并渲染页面说明平台后端Windows 上的 WinForms/WebView2、macOS 上的 Cocoa/WKWebView、Linux 上的 GTK 或 Qt已正确就绪。环境变量PYWEBVIEW_GUI可强制指定后端例如PYWEBVIEW_GUIqt python examples/simple_browser.py无头环境下也可借助QT_QPA_PLATFORMoffscreen或DISPLAYXvfb运行。开发工作流从分支到 Pull Request从 master 创建并切换到新分支git checkout -b new-branch master实施你的修改。格式化与 lintpre-commit 会自动执行手动运行可选ruff check --fix . ruff format .运行测试pytest tests提交并推送git add . git commit -m Your commit message goes here # Pre-commit hooks will run automatically git push -u origin new-branch创建 Pull Request目标分支为master。关于提交信息AGENTS.md 补充了本仓库的约定提交标题采用[Scope] Imperative description格式Scope 为后端或区域名[Core]、[Cocoa]、[GTK]、[Qt]、[Winforms]、[EdgeChromium]、[CEF]、[MSHTML]、[Android]、[Docs]多后端可用斜杠合并如[Winforms/EdgeChromium/MSHTML] Fix ...。同时要求一次提交只包含一个逻辑变更不要把修复与无关的重格式化混在一起。打开 PR 前还应注意任何用户可见的变更都应在 docs/CHANGELOG.md 的## Unreleased标题下新增条目修改公共 API 时同步更新 docs/api/README.md。测试体系pywebview 的 pytest 冒烟测试pywebview 使用 pytest 作为测试框架。运行全部测试在项目根目录执行pytest testspyproject.toml 中的[tool.pytest.ini_options]声明了testpaths [tests]和timeout 60配合pytest-timeout60 秒未结束的测试将被判定失败而不是卡住整个测试进程。运行单个测试文件pytest tests/test_simple_browser.py仓库 tests 目录中每个功能都有对应的测试文件例如 tests/test_js_api.py、tests/test_window.py、tests/test_evaluate_js.py 等可按功能点单独运行。测试的性质与局限原文档明确指出测试只覆盖琐碎的错误、语法错误和异常等没有功能测试。每个测试验证的是在不同场景下pywebview 窗口能够打开并无错误地退出。也就是说这套测试本质上是集成冒烟测试——它会真实地打开原生窗口。从 tests/util.py 的源码可以看到支撑这套体系的工具函数run_test(webview, window, thread_func, ...)创建窗口、在后台线程中执行测试逻辑等待线程结束后销毁窗口线程中抛出的异常会经队列传回主线程并调用pytest.failassert_js(window, func_name, expected_result, ...)通过 JS 桥调用window.pywebview.api.func并轮询比对返回值用于跨 Python/JS 边界的断言create_test_window与_destroy_window负责窗口生命周期管理测试逻辑放在thread_func中等待window.events.loaded事件后再执行。编写新测试时应复用 tests/util.py 中的辅助函数而不是各自重新实现窗口生命周期。此外tests/conftest.py 会在每个测试之间重新加载webview与webview.http模块并设置PYWEBVIEW_TESTtrue因此库中的模块级状态必须能在这种重载下存活。关于随机失败原文档坦诚地说明测试有时会随机失败或卡住原因未知欢迎协助排查。这并非个例——AGENTS.md 也提示 Some tests fail or hang intermittently, especially on Windows并建议单次失败并不足以证明是回归重跑后再下结论在无头环境中通常根本无法运行整套测试没有显示器、WebView2 或 PyObjC此时应如实说明哪些已验证、哪些无法验证而不是宣称测试通过。调试时常用环境变量包括PYWEBVIEW_GUI强制指定后端、PYWEBVIEW_LOGdebug、error等日志级别、PYWEBVIEW_TEST、QT_QPA_PLATFORMoffscreen与DISPLAYXvfb 虚拟显示。代码格式化与静态检查Ruff pre-commitpywebview 使用 Ruff 负责代码格式化与 lint并用 pre-commit 钩子自动强制执行代码质量标准。Pre-commit 钩子执行pre-commit install后钩子会在每次提交前自动运行负责修复 import 排序应用一致的代码格式单引号、行长度等检查大文件、尾随空白与 YAML 语法运行 lint 检查并尽可能自动修复。也可以手动运行全部钩子pre-commit run --all-files这与 CI 中Code Quality作业的行为一致AGENTS.md 提到 CI 会运行pre-commit run --all-files。Ruff 配置项目在 pyproject.toml 中定义了完整的 Ruff 配置配置项值行长度100 字符line-length 100引号风格字符串使用单引号quote-style singleimport 排序启用webview标记为已知的一方包known-first-party [webview]目标 Python 版本3.10target-version py310启用的规则PyflakesF、pycodestyle 子集E4、E7、E9、isortI、pyupgradeUP值得注意的细节缩进4 空格、空格而非 Tabindent-style spaceMagic trailing comma与 Black 一致尊重魔法尾随逗号skip-magic-trailing-comma falseMarkdown 被排除extend-exclude [*.md]Ruff 会格式化 Markdown 内的 Python 代码块但文档示例是为可读性而非 PEP 8 写的因此不加干预虚拟变量允许_前缀的未使用变量dummy-variable-rgx允许对所有启用规则自动修复fixable [ALL]。手动运行格式化与 lint虽然 pre-commit 会自动处理也可以手动执行# 检查 lint 问题并应用修复 ruff check --fix . # 格式化代码 ruff format . # 手动运行全部 pre-commit 钩子 pre-commit run --all-files代码风格指南原文档列出的风格要点如下字符串使用单引号除非字符串本身包含单引号最大行长度为100 字符遵循PEP 8约定优先使用f-string避免.format()或%格式化移除未使用的 import 与变量使用isinstance()而不是type()比较。AGENTS.md 在此基础上补充了更细的约定模块级日志统一用logging.getLogger(pywebview)库代码禁止print()docstring 采用:param x:的 reST 风格参见 webview/window.py 与 webview/init.py新公共 API 必须带类型注解包已随py.typed发布平台后端模块是唯一的例外——它们要镜像原生 API 的命名如windowDidResize_、OnNavigationCompleted遵循所在文件的风格而非 PEP 8。关于 Python 版本兼容由于目标版本是 3.10list[str]PEP 585、str | NonePEP 604与match均可直接使用Self、Unpack3.11 引入必须从typing_extensions导入StrEnum在 webview/state.py 中通过try/except ImportError做了兼容垫片。学习资源按平台深入后端实现原文档按平台列出外部官方文档Windows Forms、pyobjc、AppKit、WebKit、PyGObject、Qt for Python 等。在仓库内与之对应的最佳学习路径是直接阅读各平台后端的源码因为 pywebview 每个后端都实现了相同的模块级函数契约setup_app、create_window、load_url、evaluate_js、destroy_window、resize、get_screens等完整清单参见 AGENTS.md规范清单以 webview/platforms/cocoa.py 为准Windows后端实现见 webview/platforms/winforms.pyWinForms 宿主 WebView2即 webview/platforms/edgechromium.py以及已废弃的 webview/platforms/mshtml.py其 C# 互操作源码在 interop/mshtml 中webview/lib下的 DLL 由这些源码构建而来不应手工编辑macOS见 webview/platforms/cocoa.py通过 PyObjC 绑定 Cocoa 与 WebKitLinux见 webview/platforms/gtk.py通过 PyGObject 使用 GTK 3 与 WebKit2Qt见 webview/platforms/qt.py通过 QtPy 兼容 Qt5/Qt6 与 QtWebEngineAndroid见 webview/platforms/android通过 pyjnius 调用 Android WebView对应 Java 源码在 interop/android。后端选型与检测逻辑位于 webview/guilib.py。更宏观的架构讲解可阅读 docs/guide/architecture.md各平台的系统级安装要求见 docs/guide/installation.md。此外仓库还提供了一份面向 AI 编码 Agent、但同样适合人类贡献者的架构总纲 AGENTS.md它系统描述了Window与后端解耦、uid寻址、JS↔Python 桥webview/util.py 中的js_bridge_call、生命周期事件门控_shown_call等装饰器以及webview.token的 CSRF 防护机制是理解代码如何组合在一起的最完整资料。小结pywebview 的贡献流程可以浓缩为一条清晰的主线先开 issue 讨论 → Fork 并搭建[dev]环境 → 新建分支实施修改 → 交给 Ruff pre-commit 自动把关格式 → 用pytest tests做冒烟验证 → 按[Scope]规范提交并发起 Pull Request。测试套件不以功能断言见长而以真实窗口能开能关的集成冒烟为底线代码规范则由 Ruff100 字符行宽、单引号、isort、pyupgrade与 pre-commit 钩子强制执行。理解这套流程与背后的约定是向 pywebview 提交高质量补丁的第一步。赞分享桌面应用前端【免费下载链接】pywebviewBuild GUI for your Python program with JavaScript, HTML, and CSS项目地址https://gitcode.com/gh_mirrors/py/pywebview点击查看免费下载相关推荐DeepSearcher 贡献指南基于 uv 的开发环境搭建、Ruff 代码规范与测试工作流DeepSearcher 贡献指南基于 uv 的开发环境搭建、Ruff 代码规范与测试工作流 本文基于 DeepSearcher 仓库根目录的 CONTRIB人工智能大模型RAGAI Agent深度研究知识库NgRx Platform 开源贡献指南开发环境搭建、测试工作流与 Commit Message 规范NgRx Platform 开源贡献指南开发环境搭建、测试工作流与 Commit Message 规范 本文基于 CONTRIBUTING.md https:前端状态管理SvelteKit 代码库 AI Agent 协作指南monorepo 环境搭建、测试体系与代码风格规范SvelteKit 代码库 AI Agent 协作指南monorepo 环境搭建、测试体系与代码风格规范 本文面向在 SvelteKit monorepo 中Web框架后端前端上一篇Windows蓝屏模拟器终极指南如何安全体验系统崩溃的刺激下一篇终极指南3步彻底解决机械键盘连击问题的免费Windows工具 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考