插件想法
想法来自于 Anki 插件:ankiweb.net/shared/info/1915225457,没想到 Anki 程序内部还能内嵌浏览器,不可思议
换在从前,想想自己那么菜的技术也就过了,可是目前有了 GPT 的加持,事情就变得不可思议了。当然,想要开发一款体验性能都好的插件,一个可称之为 项目
的插件,GPT 目前还是不太行的,下面为使用 GPT 辅助开发的两个简单 Anki 插件
插件目录
打开 Anki,快捷键 Ctrl+Shift+A
可弹出插件管理器,点击 查看文件
可以跳转到 Anki 插件的安装目录
例如我的 Anki 插件文件路径为:C:\Users\Administrator\AppData\Roaming\Anki2\addons21
创建插件
新建文件夹,例如 BrowserPlugin
,在文件夹中新建 __init__.py
文件,之后在该 python 文件中编辑代码即可。
PS:每次修改代码之后,需重启 Anki 以重新加载插件,插件为自动加载方式
ANKI 插件的完整生成过程可参考与 GPT 的对话:ChatGPT - 开发 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
| 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: 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 搜索菜单项,点击即可使用外部浏览器对选中的文字进行搜索,效果如下:
进一步完善插件
如上所述,搜索时使用外部浏览器进行搜索,能否在 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): 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 程序中的位置,展示效果如下: