书砚 插件开发指南 适配 v1.0.0 · PySide2 返回首页
书砚 / 插件开发指南 / 发布与维护

发布与维护

插件写完后如何安装、启用 / 禁用、调试排错,以及开发时需要牢记的限制事项。

插件管理

安装与卸载

工具 → 扩展管理 打开扩展管理对话框,可以:

  • 📦 安装:选一个 .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 到书砚进程。