PythonIDE Docs
中文
简体中文

快捷指令启动器

运行快捷指令、打开 URL、系统设置入口和复制链接。

演示 shortcuts.run_shortcutopen_urlopen_settings 与自动化入口列表。

#预期效果

运行后会出现快捷指令启动器,运行快捷指令、打开 URL、复制链接和状态反馈都在列表中完成。

#完整示例

python
import appui
import clipboard
import haptics
import shortcuts

state = appui.State(
    shortcut_name="",
    url="https://apple.com",
    status="等待操作",
    entries=[
        {"title": "打开 Apple", "url": "https://apple.com", "icon": "safari.fill"},
        {"title": "打开 Pythonista Scheme", "url": "pythonista://", "icon": "terminal.fill"},
        {
            "title": "复制快捷指令库链接",
            "url": "https://www.icloud.com/shortcuts/",
            "icon": "doc.on.doc.fill",
        },
    ],
)


def set_shortcut_name(value):
    state.shortcut_name = value


def set_url(value):
    state.url = value


def run_named_shortcut():
    name = state.shortcut_name.strip()
    if not name:
        state.status = "请输入快捷指令名称"
        haptics.notification("warning")
        return
    ok = shortcuts.run_shortcut(name)
    state.status = f"已发起:{name}" if ok else f"无法运行:{name}"
    haptics.notification("success" if ok else "error")


def open_current_url():
    url = state.url.strip()
    if not url:
        state.status = "请输入 URL"
        haptics.notification("warning")
        return
    ok = shortcuts.open_url(url)
    state.status = f"已打开:{url}" if ok else f"无法打开:{url}"
    haptics.notification("success" if ok else "error")


def open_settings():
    ok = shortcuts.open_settings()
    state.status = "已打开系统设置" if ok else "无法打开系统设置"


def copy_url(url):
    clipboard.set(url)
    state.status = "已复制链接"
    haptics.selection()


def entry_row(item):
    def open_current():
        shortcuts.open_url(item["url"])

    def copy_current():
        copy_url(item["url"])

    return appui.HStack(
        [
            appui.Image(system_name=item["icon"]).foreground_color("systemBlue"),
            appui.VStack(
                [
                    appui.Text(item["title"]).font("headline"),
                    appui.Text(item["url"]).font("caption").foreground_color("secondaryLabel"),
                ],
                alignment="leading",
            ),
            appui.Spacer(),
            appui.Button("打开", action=open_current),
            appui.Button("复制", action=copy_current),
        ],
        spacing=10,
    )


def entry_key(item):
    return item["url"]


def body():
    return appui.NavigationStack(
        appui.List(
            [
                appui.Section(
                    [
                        appui.TextField(
                            "快捷指令名称",
                            text=state.shortcut_name,
                            on_change=set_shortcut_name,
                        ),
                        appui.Button("运行快捷指令", action=run_named_shortcut)
                            .button_style("bordered_prominent"),
                    ],
                    header="快捷指令",
                ),
                appui.Section(
                    [
                        appui.TextField("URL 或 Scheme", text=state.url, on_change=set_url),
                        appui.Button("打开 URL", action=open_current_url),
                        appui.Button("打开当前 App 设置", action=open_settings),
                    ],
                    header="系统入口",
                ),
                appui.Section(
                    [appui.ForEach(state.entries, entry_row, key=entry_key)],
                    header="自动化入口",
                ),
                appui.Section(
                    [appui.LabeledContent("状态", value=state.status)],
                    header="结果",
                ),
            ]
        ).navigation_title("自动化")
    )


appui.run(body, state=state, presentation="sheet")

#关键技巧

  • run_shortcut 只负责拉起快捷指令,不返回快捷指令的执行结果。
  • open_url / open_settings 放在按钮回调里,勿在 body() 构建时调用。
  • 用户输入的 URL 先 strip 再打开。