制作 Anki 插件简明笔记

插件想法

想法来自于 Anki 插件:ankiweb.net/shared/info/1915225457,没想到 Anki 程序内部还能内嵌浏览器,不可思议

换在从前,想想自己那么菜的技术也就过了,可是目前有了 GPT 的加持,事情就变得不可思议了。当然,想要开发一款体验性能都好的插件,一个可称之为 项目 的插件,GPT 目前还是不太行的,下面为使用 GPT 辅助开发的两个简单 Anki 插件

插件目录

打开 Anki,快捷键 Ctrl+Shift+A 可弹出插件管理器,点击 查看文件 可以跳转到 Anki 插件的安装目录

image.png

例如我的 Anki 插件文件路径为:C:\Users\Administrator\AppData\Roaming\Anki2\addons21

创建插件

新建文件夹,例如 BrowserPlugin,在文件夹中新建 __init__.py 文件,之后在该 python 文件中编辑代码即可。

PS:每次修改代码之后,需重启 Anki 以重新加载插件,插件为自动加载方式

ANKI 插件的完整生成过程可参考与 GPT 的对话:ChatGPT - 开发 Anki 插件.

我只负责引导和给出调试报错信息,代码全程由 GPT 负责生成,代码如下:

image.png

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from aqt import mw
from aqt.qt import QAction, QMenu
from PyQt6.QtCore import Qt
import webbrowser

def onGoogleSearch():
# 获取当前选中的文本
selected_text = mw.web.selectedText()

if selected_text:
# 使用浏览器打开Google搜索页面
webbrowser.open(f"https://www.google.com/search?q={selected_text}")

def showContextMenu(point):
menu = QMenu()

selected_text = mw.web.selectedText()

if selected_text:
action = QAction("Google搜索", mw)
action.triggered.connect(onGoogleSearch)
menu.addAction(action)

menu.exec(mw.web.mapToGlobal(point))

def setup_menu():
mw.web.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
mw.web.customContextMenuRequested.connect(showContextMenu)

setup_menu()

重启 Anki 之后(插件会自动加载),选中文字右键,即可弹出 Google 搜索菜单项,点击即可使用外部浏览器对选中的文字进行搜索,效果如下:

image.png

进一步完善插件

如上所述,搜索时使用外部浏览器进行搜索,能否在 Anki 程序中内嵌浏览器呢 —> 接下来还是通过 GPT 的辅助,完成初步的想法,完整示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from aqt import mw
from aqt.qt import *
from PyQt6.QtWebEngineWidgets import QWebEngineView
from PyQt6.QtCore import QUrl, Qt

class BrowserDockWidget(QDockWidget):
def __init__(self, parent=None):
super().__init__("内置浏览器", parent)
self.browser = QWebEngineView()
self.setWidget(self.browser)
self.setup_browser_settings()
self.browser.setUrl(QUrl("https://www.google.com"))

def setup_browser_settings(self):
# 确保启用 JavaScript 和其他必要的功能
settings = self.browser.settings()
settings.setAttribute(QWebEngineSettings.WebAttribute.JavascriptEnabled, True)
settings.setAttribute(QWebEngineSettings.WebAttribute.PluginsEnabled, True)
settings.setAttribute(QWebEngineSettings.WebAttribute.LocalStorageEnabled, True)
settings.setAttribute(QWebEngineSettings.WebAttribute.DnsPrefetchEnabled, True)
settings.setAttribute(QWebEngineSettings.WebAttribute.AutoLoadImages, True)

def search(self, query):
self.browser.setUrl(QUrl(f"https://www.google.com/search?q={query}"))

def show_browser_dock_widget():
if not hasattr(mw, 'browser_dock'):
mw.browser_dock = BrowserDockWidget(mw)
mw.addDockWidget(Qt.DockWidgetArea.RightDockWidgetArea, mw.browser_dock)
mw.browser_dock.show()

def on_search_google():
selected_text = mw.web.selectedText()
if selected_text:
show_browser_dock_widget()
mw.browser_dock.search(selected_text)

def context_menu_event(point):
menu = QMenu(mw)
menu.addAction("Google搜索", on_search_google)
menu.exec(mw.web.mapToGlobal(point))

def add_search_context_menu():
mw.web.setContextMenuPolicy(Qt.ContextMenuPolicy.CustomContextMenu)
mw.web.customContextMenuRequested.connect(context_menu_event)

# 添加右键菜单项
add_search_context_menu()

浏览器右上角的几个按钮可以对内置浏览器进行关闭,拖动还可以自定义浏览器在 Anki 程序中的位置,展示效果如下:

image.png

Anki.gif