发布与维护
插件写完后如何安装、启用 / 禁用、调试排错,以及开发时需要牢记的限制事项。
插件管理
安装与卸载
工具 → 扩展管理 打开扩展管理对话框,可以:
- 📦 安装:选一个 .py 文件拷进
plugins/ - 🗑 卸载:从
plugins/删除文件 - ✅ / ❌ 启用 / 禁用:禁用后下次打开不再激活(状态持久化到 DB)
- 🔄 刷新:重新扫描
plugins/目录发现新文件
调试技巧
- 插件加载失败时,书砚启动控制台会打印
[插件] 加载 xxx 失败: ...以及 Python 异常堆栈 - 在 activate 里用
api.log("调试信息")打日志,方便排查 - 修改插件代码后,重启书砚即可重新加载
- QMessageBox / QFileDialog 等需要 parent,传入
api.window即可
限制与注意事项
- PySide2 版本(不是 PySide6)——某些 Qt 类如
QBoxLayout.widgets()在 PySide2 不存在,用count()+itemAt()代替 - 插件在
EditorPage.__init__末尾激活,此时侧边栏 / 工具栏 / 菜单栏已全部构建好 - 不要在插件里直接操作
EditorPage._xxx以下划线开头的私有方法——应该走 PluginAPI 提供的公开方法 api.editor在刚打开项目但没进入章节时是 None,注意判空
插件开发常见问题
Q:插件加载失败怎么办?
打开书砚,控制台会打印 [插件] 加载 xxx 失败: ... 和完整 Python 异常堆栈,对照报错行号排查即可。
Q:为什么 activate 里 api.editor 是 None?
因为还没有打开任何章节。用 if api.editor: 判空,或者用 Hook(api.on_chapter_switched)延迟到章节打开后再操作编辑器。
Q:改了插件代码要重启书砚吗?
是的。插件在 EditorPage.__init__ 里加载一次,不支持热更新。
Q:插件名可以用中文吗?
文件名最好用英文 + 下划线(如 my_plugin.py),get_info()['display_name'] 可以用中文,会显示在扩展管理对话框里。
Q:怎么调试插件?
最简单的方法:在代码里插 api.log("调试信息"),会打印到书砚的控制台窗口。也可以用 PyCharm / VSCode 的 Python 调试器直接 attach 到书砚进程。