docs: 完善README文档与架构图,修复全量注释与日志问题

- README: 补充项目概述、技术栈、架构图(Mermaid)、插件生命周期时序图
- build.py: 补充模块和函数 docstring
- core/__init__.py: 修正模块说明(工具箱→插件系统)
- log.py: 修复过时注释,清理死代码,抑制第三方库日志刷屏
- plugin_registry.py: 修正矛盾注释,补充缺失日志,隐藏远程路径
- plugins.py: 修正过时注释,清理死代码和无用导入
- plugins_card.py: 修正错误类名注释,补充全量 docstring
- main.py: 修正错误注释,补充启动/退出/插件加载日志
This commit is contained in:
2026-07-21 17:04:34 +08:00
parent 0efaf2946b
commit 1b6796ec43
8 changed files with 282 additions and 138 deletions
+19 -20
View File
@@ -17,9 +17,6 @@ import subprocess
import runtime_hook # noqa: F401 启动时把 plugins/*/ 加进 sys.path,必须在 core 之前
import core
import traceback
import importlib
from pathlib import Path
from typing import Optional
from PySide6.QtCore import QTimer
@@ -38,7 +35,6 @@ MICRO_VER: int = 1 # 修订版本号
APP_NAME: str = "Model Team Tools"
APP_VERSION: str = f"{MAJOR_VER}.{MINOR_VER}.{MICRO_VER}"
LOCAL_PLUGINS_PATH = Path("./plugins")
class MainWindow(QMainWindow, Ui_MainWindow):
"""
@@ -57,7 +53,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.plugin_registry.plugins_loader_signal.connect(self.on_plugins_loader)
self.plugin_registry.uninstall_completed_signal.connect(self.on_plugin_uninstalled)
# 工具栏:插件名称 → QAction 映射
self.tool_actions: dict = {}
# 内容区:插件名称 → QWidget 映射
self.plugin_widgets: dict = {}
self.initUI()
@@ -106,19 +104,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
logger.warning(f"样式加载失败,使用默认主题: {e}")
def on_tools(self) -> None:
"""打开工具箱窗口
创建并显示工具箱窗口实例。包含完整的错误处理机制,
确保任何异常都不会导致主程序崩溃。
异常处理:
- 捕获所有异常并记录到日志
- 显示详细的错误堆栈信息
- 不影响主窗口的正常使用
日志记录:
- 成功打开工具箱时记录 INFO 级别日志
- 打开失败时记录 ERROR 级别日志
"""打开插件管理窗口
包含完整的错误处理机制,确保任何异常都不会导致主程序崩溃。
"""
try:
self.plugins.show()
@@ -126,7 +114,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
logger.error(f"无法打开工具箱窗口: {e}")
logger.error(traceback.format_exc())
def on_plugins_loader(self, plugins:dict):
def on_plugins_loader(self, plugins: dict) -> None:
"""加载已安装插件到主窗口工具栏和堆栈页面。
为每个插件创建 QAction 并添加到工具栏,同时将插件 QWidget
添加到 stackedWidget 中,点击 action 时切换对应页面。
"""
if not plugins:
return
for name in plugins.keys():
action = QAction(name,self)
self.toolBar.addAction(action)
@@ -136,9 +131,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.stackedWidget.addWidget(widget)
self.tool_actions[name] = action
self.plugin_widgets[name] = widget
logger.info(f"已加载 {len(plugins)} 个插件到工具栏: {list(plugins.keys())}")
def on_action_triggered(self, action:QAction):
print(action.text())
def on_action_triggered(self, action: QAction) -> None:
"""工具栏按钮点击:切换到对应插件的 stack 页面。"""
self.stackedWidget.setCurrentWidget(self.plugin_registry.plugins[action.text()]['obj'])
def on_plugin_uninstalled(self, name: str) -> None:
@@ -147,6 +143,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
.pyd 已被进程加载,运行时无法删除(Windows 文件锁),因此重启进程:
新进程启动时会先执行待删清单,在 import 之前删除 .pyd 文件。
"""
logger.info(f"从主窗口移除插件: {name}")
action = self.tool_actions.pop(name, None)
if action is not None:
self.toolBar.removeAction(action)
@@ -197,8 +194,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if __name__ == '__main__':
print(f"{APP_NAME} v{APP_VERSION} 启动中...")
app = QApplication(sys.argv)
main: MainWindow = MainWindow()
app.aboutToQuit.connect(lambda: logger.info(f"{APP_NAME} 退出"))
app.aboutToQuit.connect(main.plugin_registry.shutdown)
main.show()
sys.exit(app.exec())