去年考研,发现了背诵神器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的具体操作了,至于怎么获取到单词的解释就很简单了,我获取的词典网页内容,然后截取的字符串