PawUI
官网 / 文档站:pawui.pages.dev
轻量、直接运行的 Python 声明式 UI 层。HTML 风格,Qt/PySide6 渲染(原生抗锯齿、QSS 圆角/悬停/聚焦、IME 组字正常),无构建。
安装
pip install pawui # 依赖 PySide6>=6.5,自动安装
python -m pip install --upgrade pawui
运行
pawui app.paw
也可以传统方式启动:
import pawui
pawui.run("app.paw")
示例
仓库里有两个可以直接跑的示例:
| 文件 | 内容 |
|---|---|
app.paw |
最小起步:主题、状态绑定、事件、自定义组件 |
examples/showcase.paw |
全组件总览:一窗 6 个标签页覆盖全部 52 个内置组件 + If / For 逻辑标签 |
pawui examples/showcase.paw # 想看某个组件怎么写,直接翻这个文件
pawui check examples/showcase.paw
examples/showcase.paw 同时是被 CI 守着回归的「能跑的文档」:它必须一直通过
pawui check、能完整建树、且不产生 Qt 样式表告警。
语法(HTML 风格)
<Window title="你好" width="460" height="840" theme="dark">
<Column padding="24" spacing="12">
<Text size="24" bold>欢迎使用 PawUI 👋</Text>
<Text size="13" color="subtext">副标题</Text>
<Text>{$greeting}</Text>
<Row spacing="8">
<Button on_click="increment">点我 +1</Button>
<Button on_click="reset">清空</Button>
</Row>
<Input placeholder="输入你的名字..." on_change="on_name"/>
<Text>你好,{$name}</Text>
<Card label="点击量" value="{$count}"/>
</Column>
</Window>
<!-- 自定义组件 -->
<Component name="Card">
<Column padding="12" bg="surface">
<Text color="subtext">{$label}</Text>
<Text size="22" bold>{$value}</Text>
</Column>
</Component>
<script>
def increment():
state.count = int(state.get("count", 0)) + 1
</script>
要点
- 状态绑定:
{$count}/{count}/$count,在<script>里改state.count = ...界面自动刷新。 - 事件:字符串引用
<script>/main.py里的函数:on_click="函数名"。 - 组件:
<Component name="X">...</Component>定义,直接<X .../>使用。 - 主题:默认
light(蓝色主色),theme="dark"可切暗色;颜色直接引用:color="subtext"、bg="surface"。字体与字号改theme.font_family/theme.font_size,圆角用radius="12"。 - 布局:
Column纵排、Row横排,spacing/padding调节。
内置组件
52 个组件 + 3 个逻辑标签(If / For / Tab),pawui schema 会有完整属性表。
全部组件的用法都能在 examples/showcase.paw 里找到实例。
| 分类 | 组件 |
|---|---|
| 布局 | Window Column Row Grid Scroll SplitPane Panel Accordion Spacer Divider |
| 文本 | Text Markdown CodeBlock Link Badge Tooltip |
| 交互 | Button Input TextArea Checkbox RadioGroup Radio Segmented Select Slider NumberInput DoubleInput DatePicker TimePicker DateTimePicker FilePicker ColorPicker Dial Menu |
| 反馈 | Alert Badge Tooltip Toast(app.toast()) |
| 数据 | Table Tree List VirtualList Progress Tabs Form Dialog GroupBox LCD |
| 媒体与绘图 | Image Canvas Web(需要 PySide6-Addons) Avatar Skeleton Spinner |
| 其他 | Shortcut If(条件) For(循环) |
样式:在 .paw 里写 CSS3
<Style>
:root { --brand: #ff7a1a; }
Card { radius: 14; padding: 16; bg: var(--surface); }
.card.title { font-size: 18px; font-weight: 600; }
#save:hover { bg: var(--brand); }
.card Text { color: var(--subtext); }
</Style>
选择器、CSS 变量、盒模型、flex(grow / shrink / wrap / justify / align)、
class / id 全支持。Qt 不认的 var() 与文本属性由 PawUI 编译期处理后交给 Qt。
样式没生效就跑 pawui inspect app.paw,它会告诉你每个控件真正命中了哪些选择器。
脚本操作页面
def wire():
app.on(".card", "click", lambda e: app.toast(e.target.text, "success"))
app.append("#list", "<Text>新行</Text>")
app.query("#title").add_class("highlight")
app.inject_css("#title { radius: 8px; }")
ready(wire)
query / query_all / on / append / prepend / remove / css / toast,
事件会冒泡。大列表用 <VirtualList rows="{$rows}"> —— 只渲染视口里的行,
实测 10 万行建树 139ms。
<For each="item" in="{$items}">
<If condition="{$item.done}">
<Text>{$item.name}</Text>
</If>
</For>
CLI
pawui run app.paw # 运行(或直接 pawui app.paw)
pawui watch app.paw # 热重载:保存即重建窗口
pawui check app.paw # 仅语法检查
pawui schema # 输出组件 JSON Schema
pawui render app.paw # 离屏渲染自检
pawui inspect app.paw # 控件树 + 命中的 CSS + state 订阅
pawui help # 列出文档主题(线上获取,离线回落随包文档)
pawui help theming # 查看某篇文档
pawui help --refresh # 强制刷新线上文档
pawui --version
pawui help 的正文来自官网(pawui.pages.dev/static/data.js,6 小时缓存,
离线自动回落随包 docs/),所以文档更新不用等发版。
PAWUI_DOCS_OFFLINE=1 强制离线,PAWUI_DOCS_LANG=zh|en 指定语言。
许可证
LGPL-3.0-or-later(LICENSE 为 LGPL-3.0,COPYING 为它引用的 GPL-3.0)。
一句话:你可以把用 PawUI 做的程序闭源发布,但要
- 声明你的程序用了 PawUI(About 框 / README 写一行),并随程序附带
LICENSE与COPYING; - 允许用户替换这个库 —— PawUI 是普通 Python 包,只要别静态焊死进可执行 文件,这条天然满足。
和 PySide6(同样 LGPL-3.0)一致 —— 所以你并没有在 Qt 已有的要求之上多承担什么。
不想受这些约束,就用宽松许可的 UI 库。
发版
凭据放在仓库外(仓库是公开的):~/.pypirc 存 PyPI 令牌,
~/.pawui/secrets.env 存 GITHUB_TOKEN / SITE_REPO。
python tools/release.py build # 清 dist + build + twine check
python tools/release.py upload # twine upload(读 ~/.pypirc,已存在的版本自动跳过)
python tools/release.py publish # 打 tag + push + 建 GitHub Release
python tools/release.py site # docs 同步到站点仓库 + 重建 data.js + 推送
python tools/release.py all # build → upload → publish
Release 正文自动从 CHANGELOG.md 里对应版本那一段抠出来。
Metadata
Release files for pawui 0.1.3.5.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pawui-0.1.3.5.1.tar.gz | 258.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pawui-0.1.3.5.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 550.4 kB
Release files / pawui-0.1.3.5.1.tar.gz
| Download URL | pawui-0.1.3.5.1.tar.gz |
|---|---|
| Size | 258.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
bef2db605e28aa2419ea23fd489f1f4c38a928eef984e61baced83d1f9c73d21
|
|
BLAKE2b-256 checksum How to use checksums |
35128d6592fb825ebd7051b92f3405278e330c04496bdc3267d4a1969a0f8977
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|
Release files / pawui-0.1.3.5.1-py3-none-any.whl
| Download URL | pawui-0.1.3.5.1-py3-none-any.whl |
|---|---|
| Size | 292.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5da7ce9f5c243ffad43f49369e7fa81628ac6da85f9ede5526a8c6c0a1ff24cf
|
|
BLAKE2b-256 checksum How to use checksums |
4a416f05f6eb9fbf4a65d7da20c69220d233efd6ac43f625bf6b9ef326bc929d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.11.17
|