制作一个插件/Making a Plugin
LDownload 下载器支持插件的扩展,你可以通过编写Python脚本来制作自己的插件。
准备工作/Prerequisites
- Python 3.10+
- 一台电脑
开始/Getting Started
创建一个Python文件
定义run,need和description三个函数
python
def run(PluginsAPI):
pass
def need():
return "PluginsAPI"
def description():
return "This is a sample plugin."
def inject_class():
return Falserun函数将会在插件被激活时执行,description函数将会返回插件的描述,need函数将会返回插件需要的参数,可以用这个使用Plugin API中没有但是源文件中有的方法。
2024/12/8补充:现在必须要多定义一个inject_class函数,返回是否可以在其他插件中使用此插件提供的API,返回布尔值,必须要定义,否则加载失败
2024/12/7补充:need函数填写的参数必须与run函数调用的参数一致,否则会报错。
Plugin API/Plugin API
LDownload 下载器提供了一些API,你可以在run函数中调用这些API。
Plugin API 源代码:
python
class PluginsAPI:
def __init__(self, plugin_dir):
self.plugin_dir = plugin_dir
self.descriptions = load_plugins(plugin_dir)
def add_file(self, url):
global filelist
filelist.append(url)
print(filelist)
def gets_filelist(self):
for i in filelist:
print(i + " ")
def run_download(plugin_name):
print("插件" + plugin_name + "开始调用PluginsAPI以运行下载任务")
go()
def plugin_window_create(self, title, geometry):
# 创建插件的窗口,每个插件一个窗口
global plugin_window
plugin_window.append(tk.Toplevel(mainwindow))
plugin_window[-1].title(title)
plugin_window[-1].geometry(geometry)
def window_add_label(self, text, plugin_name):
# 在插件窗口中添加标签
global plugin_window
plugin_window[-1].label = tk.Label(plugin_window[-1], text=text)
plugin_window[-1].label.pack(pady=10)
def window_add_entry(self, text, plugin_name):
# 在插件窗口中添加输入框
global plugin_window
plugin_window[-1].entry = tk.Entry(plugin_window[-1])
plugin_window[-1].entry.pack(pady=10)
def window_add_button(self, text, plugin_name, command):
# 在插件窗口中添加按钮
global plugin_window
plugin_window[-1].button = tk.Button(plugin_window[-1], text=text, command=command)
plugin_window[-1].button.pack(pady=10)
def read_add_entry(self, plugin_name):
# 读取插件窗口中的输入框内容
global plugin_window
return plugin_window[-1].entry.get()
def window_destroy(self, plugin_name):
# 销毁插件窗口
global plugin_window
plugin_window[-1].destroy()
plugin_window.pop()- add_file(url): 向下载队列中添加一个文件
- gets_filelist(): 获取下载队列中的文件
- run_download(): 启动下载器
- plugin_window_create(title, geometry): 创建插件的窗口,每个插件一个窗口
- window_add_label(text, plugin_name): 在插件窗口中添加标签
- window_add_entry(text, plugin_name): 在插件窗口中添加输入框
- window_add_button(text, plugin_name, command): 在插件窗口中添加按钮
- read_add_entry(plugin_name): 读取插件窗口中的输入框内容
- window_destroy(plugin_name): 销毁插件窗口 2024/12/7补充:PluginAPI源码更新到1.2.1Beta
调用Plugin API/Use Plugin API
在run函数中调用Plugin API
实例:
python
# plugins/sample.py
def description():
return "This is a sample plugin."
def need():
return "PluginsAPI"
def run(PluginsAPI):
api = PluginsAPI("PluginsAPI")
while True:
print("LDownload 命令行插件")
print("1. 添加文件")
print("2. 显示已添加文件")
print("3. 开始下载")
print("4. 退出")
choice = input("请输入选项:")
if choice == "1":
url = input("请输入URL:")
api.add_file(url)
elif choice == "2":
files = api.gets_filelist()
print(files)
elif choice == "3":
api.run_download()
elif choice == "4":
break
else:
print("输入错误,请重新输入!")2024/12/7补充:该插件只能在从源码运行,打包好的版本没有控制台,所以不能用print函数输出信息。 解释:
- 定义description函数,返回插件的描述。
- 定义need函数,返回插件需要的参数。
- 定义run函数,参数为PluginsAPI。
- 实例化PluginsAPI,传入插件目录。
- 循环,让用户选择功能。
- 如果选择添加文件,则调用add_file函数,传入URL。
- 如果选择显示已添加文件,则调用gets_filelist函数,获取下载队列中的文件。
- 如果选择开始下载,则调用run_download函数,启动下载器。
- 如果选择退出,则退出循环。
- 其他情况,打印错误信息。
调试/Debug
将上面编写的插件文件放到plugins文件夹中。
如果你看见了:
bash
LDownload 命令行插件
1. 添加文件
2. 显示已添加文件
3. 开始下载
4. 退出
请输入选项:说明插件已经被加载。
运行LDownload的exe文件或者直接从源码运行,这时会生成config.ini,LDownload文件夹和plugins文件夹,将你的插件文件放到plugins文件夹中。
重启LDownload,这时插件就会被加载。
发布/Publish
你可以将你的插件发布到GitHub或者其他代码托管平台,让其他人可以下载到你的插件。
注意事项/Cautions
- 插件中不能使用tkinter模块,我也不知道为什么,会出现一个空白Tk窗口,关了主程序就出问题。(替代方案:使用PluginAPI的窗口创建机制,虽然基于tkinter,但没有刚才那个问题)
2024/12/7补充:只是不能用tkinter创建窗口,messagebox等功能还是可以的。 - 不要用控制台输出,打包主程序时有noconsole,控制台会被隐藏,所以你不能用print函数输出信息。