widget 从脚本到桌面
Widget Studio 预览、发布、系统添加主屏小组件与桌面验证。
API 地图见 widget-api-index.md;完整签名见 widget-api-reference.md。
从第一行 Python 脚本到主屏/锁屏真正显示:写脚本 → 预览 → 调参 → 发布 → 系统添加小组件。
边界:本篇讲发布流程。API 与节点写法见 widget 概览;文档里的 previewWidget 只能预览,不能直接发布到桌面。
#本篇目标
| 项 | 说明 |
|---|---|
| 读完你会 | 完成一次端到端发布,并在桌面验证按钮交互 |
| 前提 | 脚本含 Widget() + w.render(),且能正常预览 |
| 推荐路径 | Widget Studio 独立项目(最省事) |
| 耗时 | 首次约 5–10 分钟(含系统添加小组件) |
#发布用脚本(可预览)
本篇示例专注发布验证:一个开关 + 状态文案,便于在桌面确认 AppIntent 是否生效。完整 API 写法(环形图、± 按钮等)见 widget 概览 · 饮水打卡。
预期效果:小组件预览面板显示与脚本一致的布局与交互。
已复制
import widget
habit = widget.param.text("习惯名", "每日阅读")
done = widget.state.bool("done", False)
accent = widget.param.color("主色", "#7C3AED")
w = widget.Widget(background=("#FAF5FF", "#1E1B4B"), padding=14)
w.text(habit, size=16, weight="semibold").line_limit(1).min_scale(0.72)
w.toggle("今日完成", state=done, color=accent, style="switch")
status = "已完成,发布验证通过" if done else "桌面点开关以验证"
w.text(status, size=12, color=accent if done else "secondary").line_limit(1).min_scale(0.72)
w.render()
预期效果
- medium:习惯名、开关、状态说明
- 桌面点开关后文案变为「已完成…」即表示
widget.state与发布链路正常
#三条入口,别搞混
| 入口 | 能预览 | 能发布到桌面 | 适用 |
|---|---|---|---|
文档 previewWidget | ✅ | ❌ | 学 API、看效果 |
| Widget Studio | ✅ | ✅ | 日常开发发布(推荐) |
| MiniApp Widget 工程 | ✅ | ✅ | 工程内多文件 widget 目录 |
文档示例要上线:把代码复制到 Studio 新建脚本,或放进自己的 Widget 工程后再发布。
#发布流程(Widget Studio)
#1. 准备脚本
- 只创建一个
w = widget.Widget(...) - 末尾调用
w.render() - 交互按钮使用
widget.state的count.increment()等 action
#2. 创建或打开项目
- 打开 App 内 Widget Studio(小组件工作区)
- 新建独立小组件项目,或打开已有脚本对应的项目
- 将上例代码保存为项目的 Python 脚本
#3. 运行预览
- 在项目卡片上点 运行(或等价入口)
- 进入全屏/Sheet 小组件预览
- 右上角切换 small / medium / large,确认无文字裁切
- 在预览侧栏调整
widget.param(习惯名、主色等)
预览成功时,Studio 会生成草稿快照;满足条件时会自动发布到 App 的 Widget 扩展缓存(状态栏常见提示:「已生成并发布 N 个尺寸」或「Widget 已更新,可在桌面选择」)。
#4. 添加到 iOS 主屏幕
发布只代表 App 内已有可渲染快照;还要在系统里添加一次小组件:
- 回到 iPhone 主屏幕(或锁屏编辑界面)
- 长按空白处 → 编辑主屏幕 → 点左上角 +
- 搜索并选择 Python IDE(或你的 App 显示名)
- 选择尺寸(小/中/大或锁屏 accessory)
- 若出现多个槽位/项目,选与 Studio 同名 的项目
- 点 添加小组件
锁屏 accessory(圆形/矩形/行内)需在锁屏编辑界面单独添加,布局要更精简(见 布局与尺寸)。
#5. 桌面验证交互
- 在主屏小组件上点 「今日完成」 开关
- 状态文案应变为「已完成,发布验证通过」
- 若不变:回到 Studio 重新运行发布,或删除桌面小组件后重新添加
#MiniApp Widget 工程(简表)
若 widget 脚本在 MiniApp 的 widgets/ 目录下:
- 在 MiniApp 编辑器打开 widget 脚本
- 运行 Widget 预览(工具栏/运行菜单)
- 构建成功且可发布时,同样会提示 「Widget 已更新,可在桌面选择」
- 按上一节 §4 在系统里添加或刷新小组件
多 widget _manifest、槽位与工程结构见 MiniApp 内说明;本篇不展开工程细节。
#发布前检查
| 检查项 | 合格标准 |
|---|---|
| 入口 | 仅一个 Widget(),最后 w.render() |
| 预览 | Studio/文档预览非空白,无构建错误日志 |
| 文本 | 可变文案有 .line_limit(1).min_scale(0.65+) |
| 尺寸 | small 只保留核心信息;medium 为默认主力 |
| 参数 | widget.param.* 在 UI 构建之前声明 |
| 状态 | 按钮 action=count.increment();开关 w.toggle(..., state=done) |
| 外观 | 浅色/深色模式下对比度可读 |
| 发布 | Studio 出现「已发布」类成功提示 |
| 桌面 | 系统已添加小组件,且选中正确项目/槽位 |
#常见错误
| 错误 | 后果 | 修正 |
|---|---|---|
| 只在文档里预览就认为已上桌面 | 主屏没有组件 | 必须走 Studio 发布 + 系统添加 |
| 预览成功但未在系统里添加小组件 | 桌面看不到 | 长按主屏幕 → + → 选 App |
| 选了错误的 Studio 项目槽位 | 显示别的 widget | 添加时核对项目名称 |
改了 widget.state 的 key | 点击计数错乱 | 重新发布;删桌面组件重装 |
| 改了布局/参数默认值 | 桌面仍旧版 | 重新运行发布;必要时删组件重装 |
| small 塞满 large 内容 | 裁切、难读 | widget.context.is_family("small") 分支 |
action 写死字符串 | 点击无效 | 用 widget.state 生成 action |
#失败路径
| 现象 | 处理 |
|---|---|
| 预览空白 | 查 w.render();勿混用 appui/scene → 排错 |
| 发布失败 / 无成功提示 | 看预览控制台日志;修脚本后重新运行 |
| 参数面板为空 | widget.param 须在 render() 前声明 → 参数面板 |
| 桌面不刷新 | 重新运行发布;删主屏小组件 → 重新添加 |
| 预览正常、桌面异常 | 确认已发布且选对口槽位;查 排错 |
| 点击无反应 | action 必须来自 widget.state → 状态和交互 |
#改脚本后要不要重新发布?
| 变更类型 | 建议 |
|---|---|
| 改颜色默认值、文案 | 重新运行发布;参数可在预览里覆盖 |
改 widget.state key | 必须重新发布;建议删桌面组件重装 |
| 改布局结构 / 新增 family | 重新运行发布,逐尺寸检查 |
| 仅改注释 | 可不发布(桌面无变化) |
#相关文档
| 文档 | 用途 |
|---|---|
| widget 概览 | API、示例、心智模型 |
| 参数面板 | widget.param 详解 |
| 状态和交互 | 按钮、开关、链接 |
| 布局与尺寸 | small/medium/large、锁屏 accessory |
| 排错 | 预览/桌面不一致 |
| API 索引 | 按任务选 API |
相关 API:widget-api-reference.md