|
1 | | -# SecRandom 插件系统 |
| 1 | +# SecPicker |
2 | 2 |
|
3 | | -## 概述 |
| 3 | +在SecRandom上运行NamePicker |
4 | 4 |
|
5 | | -SecRandom 插件系统为应用程序提供了灵活的扩展机制。通过插件系统,开发者可以轻松地添加新功能、扩展现有功能,并与主系统深度集成。 |
| 5 | +仅供娱乐,需要使用NamePicker请前往[源仓库](https://github.com/NamePickerOrg/NamePicker) |
6 | 6 |
|
7 | | -## 插件目录结构 |
8 | | - |
9 | | -``` |
10 | | -app/plugin/ |
11 | | -├── example_plugin/ # 示例插件 |
12 | | -│ ├── plugin.json # 插件配置文件 |
13 | | -│ ├── main.py # 插件主程序 |
14 | | -│ └── README.md # 插件说明文档 |
15 | | -└── [其他插件]/ # 其他插件目录 |
16 | | - ├── plugin.json |
17 | | - ├── main.py |
18 | | - └── README.md |
19 | | -``` |
20 | | - |
21 | | -## 建议 |
22 | | - |
23 | | -- **插件开发建议使用SecRandom已有的内置库,这样不用安装额外的库,也不会产生更复杂的教程** |
24 | | -- **插件开发建议使用开发SecRandom的Python版本(或更高版本),这样可以避免版本冲突** |
25 | | -- **插件开发建议使用SecRandom的日志库(loguru),这样可以方便地记录插件运行日志(建议存储在你自己插件目录下的log文件中)** |
26 | | -- **插件开发建议使用SecRandom的配置库(json),这样可以方便地读取插件配置文件(建议存储在你自己插件目录下的config文件中)** |
27 | | - |
28 | | -## 插件开发要点 |
29 | | - |
30 | | -### 1. 必需文件 |
31 | | - |
32 | | -每个插件必须包含以下文件: |
33 | | - |
34 | | -- **plugin.json**: 插件配置文件,定义插件的基本信息 |
35 | | -- **main.py**: 插件主程序,包含插件的核心功能 |
36 | | -- **README.md**: 插件说明文档,提供使用指南 |
37 | | - |
38 | | -### 2. 插件配置文件 (plugin.json) |
39 | | - |
40 | | -```json |
41 | | -{ |
42 | | - "name": "插件名称", |
43 | | - "version": "1.0.0", |
44 | | - "description": "插件功能描述", |
45 | | - "author": "插件作者", |
46 | | - "entry_point": "main.py", |
47 | | - "background_service": "service.py", |
48 | | - "min_app_version": "1.0.0.0", |
49 | | - "dependencies": [], |
50 | | - "enabled": true, |
51 | | - "autostart": false |
52 | | -} |
53 | | -``` |
54 | | - |
55 | | -### 3. 插件主程序 (main.py) |
56 | | - |
57 | | -```python |
58 | | -# 导入必要的库 |
59 | | -import json |
60 | | -import os |
61 | | -from typing import Dict, List, Optional |
62 | | -from qfluentwidgets import * |
63 | | -from PyQt5.QtWidgets import * |
64 | | -from PyQt5.QtCore import * |
65 | | -from PyQt5.QtGui import * |
66 | | -from loguru import logger |
67 | | - |
68 | | -# 插件类 |
69 | | -class MyPlugin: |
70 | | - def __init__(self): |
71 | | - self.config_path = "app/plugin/my_plugin/config.json" |
72 | | - self.config = {} |
73 | | - self.load_config() |
74 | | - |
75 | | - def load_config(self): |
76 | | - """加载配置""" |
77 | | - try: |
78 | | - if os.path.exists(self.config_path): |
79 | | - with open(self.config_path, 'r', encoding='utf-8') as f: |
80 | | - self.config = json.load(f) |
81 | | - except Exception as e: |
82 | | - logger.error(f"加载配置失败: {e}") |
83 | | - |
84 | | - def get_info(self) -> Dict: |
85 | | - """获取插件信息""" |
86 | | - return { |
87 | | - "name": "我的插件", |
88 | | - "version": "1.0.0", |
89 | | - "description": "插件描述" |
90 | | - } |
91 | | - |
92 | | - def execute(self, *args, **kwargs): |
93 | | - """执行插件功能""" |
94 | | - return "插件执行成功" |
95 | | - |
96 | | -# API 函数 |
97 | | -def show_dialog(parent=None): |
98 | | - """显示插件界面""" |
99 | | - dialog = __MyPluginDialog(parent) # 例子 |
100 | | - dialog.exec_() |
101 | | - |
102 | | -def get_plugin_info() -> Dict: |
103 | | - """获取插件信息""" |
104 | | - plugin = MyPlugin() |
105 | | - return plugin.get_info() |
106 | | -``` |
107 | | - |
108 | | -### 4. 插件服务 |
109 | | - |
110 | | -如果插件需要在后台运行服务,应在 `service.py` 文件中实现: |
111 | | - |
112 | | -```python |
113 | | -class MyPluginService: |
114 | | - def __init__(self): |
115 | | - # 初始化服务 |
116 | | - pass |
117 | | - |
118 | | - def start(self): |
119 | | - # 启动服务 |
120 | | - pass |
121 | | - |
122 | | - def stop(self): |
123 | | - # 停止服务 |
124 | | - pass |
125 | | -``` |
126 | | - |
127 | | -## 插件系统特性 |
128 | | - |
129 | | -### 核心优势 |
130 | | - |
131 | | -1. **模块化设计**: 每个插件都是独立的模块,便于开发和维护 |
132 | | -2. **易于集成**: 提供标准的API接口,与主系统无缝集成 |
133 | | -3. **配置灵活**: 支持动态配置,用户可以自定义插件行为 |
134 | | -4. **界面统一**: 使用 qfluentwidgets 保持界面风格一致 |
135 | | -5. **错误处理**: 完善的异常处理和日志记录机制 |
136 | | - |
137 | | -### 技术特点 |
138 | | - |
139 | | -- **基于 PyQt5**: 使用成熟的桌面应用框架 |
140 | | -- **配置管理**: JSON 格式的配置文件,易于编辑和备份 |
141 | | -- **日志系统**: 集成 loguru 日志库,便于调试和监控 |
142 | | -- **信号槽机制**: 支持事件驱动的编程模式 |
143 | | -- **类型提示**: 使用 Python 类型提示,提高代码质量 |
144 | | - |
145 | | -## 开发指南 |
146 | | - |
147 | | -### 1. 环境要求 |
148 | | - |
149 | | -- Python 3.8.10+ |
150 | | -- PyQt5 |
151 | | -- qfluentwidgets |
152 | | -- loguru |
153 | | - |
154 | | -### 2. 开发步骤 |
155 | | - |
156 | | -1. **创建插件目录**: 在 `app/plugin/` 下创建插件目录 |
157 | | -2. **编写配置文件**: 创建 `plugin.json` 定义插件信息 |
158 | | -3. **实现主程序**: 编写 `main.py` 实现插件功能 |
159 | | -4. **实现服务**: 如果需要后台服务,编写 `service.py` |
160 | | -5. **添加界面**: 创建图形界面(如需要) |
161 | | -6. **编写文档**: 创建 `README.md` 说明插件用法 |
162 | | -7. **测试调试**: 测试插件功能并调试问题 |
163 | | -8. **打包发布**: 打包插件为 zip 文件,发布到插件广场 |
164 | | - |
165 | | -### 3. 最佳实践 |
166 | | - |
167 | | -- **命名规范**: 使用清晰的命名约定 |
168 | | -- **错误处理**: 添加适当的异常处理 |
169 | | -- **日志记录**: 记录重要的操作和错误 |
170 | | -- **配置管理**: 合理使用配置文件 |
171 | | -- **界面设计**: 遵循主系统的界面风格 |
172 | | - |
173 | | -### 4. 调试技巧 |
174 | | - |
175 | | -```python |
176 | | -# 在 main.py 末尾添加测试代码 |
177 | | -if __name__ == "__main__": |
178 | | - app = QApplication([]) |
179 | | - # 测试插件功能 |
180 | | - dialog = MyDialog() |
181 | | - dialog.show() |
182 | | - app.exec_() |
183 | | -``` |
184 | | - |
185 | | -### 5. 软件没有对应库的情况 |
186 | | - |
187 | | -在插件系统中,如果软件没有对应库的情况,需要在插件的 `plugin.json` 文件中添加 `dependencies` 字段,指定插件依赖的库。例如: |
188 | | - |
189 | | -```json |
190 | | -{ |
191 | | - "name": "插件名称", |
192 | | - "version": "1.0.0", |
193 | | - "description": "插件功能描述", |
194 | | - "author": "插件作者", |
195 | | - "entry_point": "main.py", |
196 | | - "min_app_version": "1.0.0", |
197 | | - "dependencies": ["transformers", "torch"], |
198 | | - "enabled": true |
199 | | -} |
200 | | -``` |
201 | | - |
202 | | -### 6. SecRandom 程序逻辑是怎么安装python库的? |
203 | | - |
204 | | -SecRandom 程序在启动时会检查插件目录下的 `plugin.json` 文件,根据 `dependencies` 字段安装插件依赖的库。如果库不存在,程序会自动从 PyPI 下载并安装。 |
205 | | - |
206 | | -### 7. 插件的依赖库是怎么管理的? |
207 | | - |
208 | | -插件的依赖库会被安装到 SecRandom 程序插件目录下的 `site-packages` 目录下。每个插件的依赖库都是独立的,不会与其它插件的库冲突。 |
209 | | - |
210 | | -## 现有插件 |
211 | | - |
212 | | -### 1. 示例插件 (example_plugin) |
213 | | -- **功能**: 演示插件系统的基本功能 |
214 | | -- **位置**: `app/plugin/example_plugin/` |
215 | | -- **用途**: 提供插件开发的示例 |
216 | | - |
217 | | -## 常见问题 |
218 | | - |
219 | | -### Q: 如何创建一个新的插件? |
220 | | -A: 复制 `example_plugin` 目录,修改其中的文件来实现你的功能。 |
221 | | - |
222 | | -### Q: 插件如何与主系统通信? |
223 | | -A: 可以通过信号槽、事件系统或直接调用主系统API来实现通信。 |
224 | | - |
225 | | -### Q: 如何处理插件的配置? |
226 | | -A: 使用 JSON 格式的配置文件,在插件初始化时加载,修改时保存。 |
227 | | - |
228 | | -### Q: 插件的界面如何保持一致? |
229 | | -A: 使用 qfluentwidgets 库创建界面,遵循主系统的设计规范。 |
230 | | - |
231 | | ---- |
232 | | - |
233 | | -© 2025 SecRandom. All rights reserved. |
| 7 | +基于NamePicker v2.0.2d1dev魔改而成(删除了浮窗,名单编辑,插件功能等等) |
0 commit comments