font_picker
系统字体选择器。
系统字体选择器:弹出 UIFontPickerViewController,返回用户选中的字体信息。
边界:pick()会阻塞脚本直到用户完成或取消(与 dialogs 类似)。只能放在按钮回调里,不要在body()或模块导入时调用。不需要额外权限。
#模块概览
| 项 | 说明 |
|---|---|
| 导入 | import font_picker |
| 适合做什么 | 主题设置、笔记 App 选字体、设计工具 |
| 调用时机 | 用户点击按钮后调用 pick() |
| 推荐顺序 | 按钮回调 → pick() → 判空 → 写入 State |
| 取消处理 | 用户取消返回 None |
#快速开始
下面脚本弹出字体选择器并打印结果:
已复制
import font_picker
try:
font = font_picker.pick()
if font is None:
print("用户取消")
else:
print(font["family"], font["name"], font.get("point_size"))
except font_picker.FontPickerError as exc:
print("字体选择失败:", exc, f"code={exc.code}")
#AppUI 示例
pick() 放在按钮回调;结果写回 State 并用 Text 预览字体名。
已复制
import appui
import font_picker
state = appui.State(
family="—",
name="—",
size="—",
status="点击按钮选择字体",
)
def choose_font():
try:
font = font_picker.pick()
if font is None:
state.batch_update(
family="—",
name="—",
size="—",
status="用户取消选择",
)
return
state.batch_update(
family=font.get("family", "—"),
name=font.get("name", "—"),
size=str(font.get("point_size", "—")),
status="已选择字体",
)
except font_picker.FontPickerError as exc:
state.status = f"选择失败: {exc}"
def body():
return appui.NavigationStack(
appui.Form([
appui.Section("当前字体", [
appui.LabeledContent("族名", value=state.family),
appui.LabeledContent("字体名", value=state.name),
appui.LabeledContent("字号", value=state.size),
appui.Text(state.name)
.font("title2")
.foreground_color("label"),
]),
appui.Section("操作", [
appui.Button("选择字体", action=choose_font)
.button_style("bordered_prominent"),
appui.Text(state.status).foreground_color("secondaryLabel"),
], footer="pick() 会阻塞直到用户完成;请在按钮回调中调用。"),
]).navigation_title("字体")
)
appui.run(body, state=state)
#API 参考
#速查
| API | 作用 |
|---|---|
pick() | 弹出系统字体选择器 → 字体字典 / None |
FontPickerError | Bridge 不可用或调用失败 |
#pick()
pick() -> dict | None
已复制
font = font_picker.pick()
成功时返回字典:
| 字段 | 说明 |
|---|---|
family | 字体族名,如 PingFang SC |
name | PostScript 字体名 |
point_size | 选择器中的参考字号(默认约 17) |
用户取消时返回 None。
#异常
Bridge 不可用时抛出 FontPickerError:
已复制
try:
font = font_picker.pick()
except font_picker.FontPickerError as exc:
print(exc.code)
#常见错误
| 错误写法 | 后果 | 修正 |
|---|---|---|
在 body() 里 pick() | 每次刷新都弹选择器 | 放进按钮回调 |
不判断 None | 用户取消后访问键崩溃 | if font is None: return |
在 onAppear 自动 pick() | 页面一打开就阻塞 | 等用户点击 |
把 point_size 当最终 UI 字号 | 可能与你的布局不一致 | 自行设定 appui.Text(...).font(...) |
#相关文档
| 文档 | 用途 |
|---|---|
| dialogs | 其他阻塞式系统面板 |
| AppUI 控件参考 | Text 字体修饰符 |
| 原生能力入口 | MiniApp 场景配方 |
#预期效果
运行示例后,界面应出现文档描述的目标结果;若与预期不符,先看「失败路径」并按返回值或日志排查。