去年考研,发现了背诵神器Anki后,就一直在用它背各种东西,当然最主要的就是背单词了。Anki最大的好处就是背诵的卡牌内容可以自己随便定义,但在背单词时,每个单词都需要手动查询解释,然后再复制到Anki里实在是有点麻烦。刚开始每天背的单词量比较大,查单词录入Anki都要花去我大量的时间,为了提高效率,当时我就自己修改了一个Anki插件,实现了只需手动输入单词,然后自动批量生成单词解释的功能。 效率提高了不少,虽然没能帮我把英语考到70分。。
录取之后闲了下来,决定将这个小功能整理一下,做个独立的插件,方便大家使用,希望能够帮助用Anki背单词的小伙伴。插件编号:2074564812,欢迎下载试用
效果图如下
因为Anki的插件开发文档不是很详细,下面简单讲一下模块的各种功能,以及开发中遇到的坑。
这里是将在Anki执行打开浏览界面时,在浏览界面的菜单栏插入一个我们插件的按钮“单词宝”。addHook相当于监听功能,在动作‘brower.setupMenus’发生时,调用我们的on_setup_menus插入菜单方法。
import anki
anki.hooks.addHook(
'browser.setupMenus',
on_setup_menus,
)
复制代码
这是具体的on_setup_menus方法。先创建一个menu,然后将menu插入到浏览界面的菜单browser.form.menubar.addMenu(menu)。 然后又在menu中定义了两个子菜单,科林次单和人人词典,用来分别用不同的词典来查询单词解释。
from PyQt5 import QtWidgets
def on_setup_menus(browser):
menu = QtWidgets.QMenu("单词宝", browser.form.menubar)
browser.form.menubar.addMenu(menu)
def kelin():
search_word(browser,type=0)
def renren():
search_word(browser, type=1)
action = menu.addAction("柯林辞典")
action.triggered.connect(kelin)
action = menu.addAction("人人辞典")
action.triggered.connect(renren)
复制代码
browser.selectedNotes()能够获取到当前浏览界面所选中的卡牌note_id,然后再通过mw.col.getNote(note_id)可以获取到卡牌的note。note中有两个比较重要的内容一个是note['Front'],和note['Back'],其中note['Front']是卡牌的问题页面内容即单词,note['Back']是卡牌翻开之后的解释即单词解释。我们要做的就是用note['Front']去查单词解释,然后将单词解释赋值给note['Back'],最后note.flash(),mw.reset()就能将更新写入Anki的数据库。
from aqt import mw
def search_word(browser,type=0):
# if type == 0:
# showInfo('科林辞典')
# else:
# showInfo('人人词典')
notes = [
mw.col.getNote(note_id)
for note_id in browser.selectedNotes()
]
total = len(notes)
n = 0
for note in notes:
result = ''
if type == 0:
result = searchWord_kelin(note['Front'])
else:
result = searchWord_renren(note['Front'])
if result == '':
# showInfo('查询失败,可以尝试使用别的词典')
n += 1
else:
# showInfo('查询成功'+note['Back'])
note['Back'] = result
note.flush()
mw.reset()
msg = '查询单词'+str(total)+'个,其中'+str(total-n)+'个成功,'+str(n)+'个失败'
showInfo(msg)
复制代码
上面就是Anki的具体操作了,至于怎么获取到单词的解释就很简单了,我获取的词典网页内容,然后截取的字符串