在 python main.py --gui 下,启动页右侧提供执行队列:将多个脚本按顺序排好后一次性运行;引擎线程在当前脚本正常退出后,由主窗口自动加载下一项,无需为「进入下一脚本」按停止键。
实现涉及:ui/page_launcher.py(列表与按钮)、ui/main_window.py(队列状态与衔接逻辑)、core/engine.py(stop_requested 结束主循环)、core/script_host.py(tick 返回值)、core/script_context.py(ctx.finish())。
| 操作 | 说明 |
|---|---|
| 加入队列 | 在左侧脚本列表选中一项,点「加入队列」;或右键脚本 →「加入队列」 |
| 调整顺序 | 选中队列中的项,使用「上移」「下移」 |
| 运行队列 | 点「运行队列」,确认对话框后从第一项开始加载 |
| 中止队列 | 红色「中止队列」,或全局快捷键(配置项 QUEUE_ABORT_HOTKEY,默认 f9):立即停止当前引擎,并取消队列中尚未开始的项 |
| 顺序 / 循环 | 单选 顺序执行:全部脚本各跑完一轮后结束;循环执行:最后一项正常退出后回到第一项,直到点「中止队列」 |
队列中的每一项仍是普通脚本项目(manifest.json + tick.py),与双击列表单独加载无区别。
引擎主循环在 WorldState.stop_requested == True 时结束;线程结束后,主窗口若处于队列模式且未「中止队列」,会自动启动下一脚本。
推荐写法(二选一):
-
ctx.finish()
在任务完成分支调用一次即可(等价于设置ctx.state.stop_requested = True)。 -
tick显式return False
仅当本次调用的返回值为字面量False时视为脚本结束。
注意:return或不写返回值会得到None,不会触发结束;其它假值(如0、[])也不会触发。
长期循环类脚本应在「本轮任务完成」条件成立时调用 ctx.finish()(或 return False),否则会一直占用引擎,队列无法前进。
录制生成的 tick.py:在 ctx.run_recorded_ops((...)) 之后会自动追加 ctx.finish(),录播跑完后会退出并进入队列下一项(若未点「中止队列」)。
| 控件 / 热键 | 队列中的含义 |
|---|---|
| 暂停 / 继续 | 仅影响当前脚本的 tick 是否执行(与队列衔接无关) |
| 停止、STOP_HOTKEY | 结束当前引擎线程;不会将队列标记为「整队作废」。线程结束后,若未点「中止队列」,仍会按队列规则尝试加载下一项(与主动 finish 衔接行为一致:都是 stop_requested 导致线程结束)。若你希望只跑当前这一个脚本而不要用队列,请在非队列方式下加载脚本。 |
| 中止队列 | 将队列标记为已中止,并下发停止;当前脚本结束后不再加载后续项。 |
若需「跳过当前、继续后面的」语义:当前实现下,对「只打断当前脚本」与「打断并接下一项」在停止键上行为接近;要彻底取消后续,请用 「中止队列」。
- 双击列表或热键启动单个脚本时,会清空队列状态(不处于队列模式)。
- 运行队列期间,主窗口会保持队列模式,直到:顺序模式下最后一项正常退出、用户点「中止队列」、引擎异常、或改加载其它单个脚本。
运行队列前的提示会说明:
- 各脚本应在逻辑结束时
ctx.finish()或return False,以便自动进入下一项; - 顺序与循环的差异;
- 停止与中止队列的差异。
- ScriptContext_API.md:
ctx.finish()、run_recorded_ops、可中断等待 - core.md:GUI 结构、输入录制、引擎与
stop_requested - 根目录 README.md:功能概览与命令行入口