目录
导语
最近在学英语,新单词需要反复背,所以就想写一个可以自己存储单词的应用。在开始写之前搜索了一下有没有人已经做好了,只查到一篇文章有比较相关的思路,但是功能只有随机抽取单词,以及需要从外部构建好CSV表格导入进去,不够方便,所以得自己写了。刚好tkinter也一直没有学过,就趁这次的机会边学边写。
程序功能
程序主要分为三个功能区,分别是:
Search模块:用于检索词库中的单词
Upload模块:用于向词库加入新单词
Next模块:用于背单词,由Next和Answer两个按键共同实现
最后呈现的功能如图所示:
需要用的工具
python 3.6
postgreSQL(用于存储词库,也可以用excel,但是响应速度慢,个人不建议)
需要安装的python包
tkinter:构建python中的Gui窗体
sqlalchemy:用于sql的连接
playsound:播放单词发音
urllib.request:从有道的API接口获取单词发音
pyinstaller:将py文件打包成exe
程序代码
程序的整体结构如图所示
功能类函数Functions
类Functions 是程序的功能集合,由Add_Words(新增单词),Next_Random(随机抽取单词),Play_Sound(播放单词发音),Search_Word(检索单词)和Show_Answer(显示单词释义)五个子函数构成。
这部分遇到的几个问题汇总如下:
- 单词发音获取:有道API获取单词发音十分方便,直接通过API接口加单词访问,参数type表示美音(0)/英音(1),audio表示对应单词。本来希望通过爬虫直接实现连网播放,尝试未果,最后还是老老实实地将单词下载到本地文件夹,每次查询单词的时候调用playsound包实现MP3的发音播放。接口也支持词组,但是词组里有空格,在访问网页时,需要将词组中的空格替换为‘%20’.
- 发音包的选择:在实现发音功能的时候尝试了许多包,playsound, pyaudio, playgame等,许多包运行出错,playsound运行成功但是响应速度大概需要肉眼可见的0.5秒。这边可以再试一下其他的包效果是否会更好。
class Functions():
def __init__(self):
self.count = 0 # 用于单词计数
self.sql = Connect('English_words') # 数据库连接
self.url = 'http://dict.youdao.com/dictvoice?type=0&audio=' # 有道云单词发音API
data = self.sql.load('word_list')
self.word_list = list(set(data['单词'])) # 词库单词列表
def Next_Random(self):
'''
从词库中随机抽取单词
'''
global text, word, counter, url, ans
self.count += 1
word = choice(self.word_list) # 随机选择一个词
text.configure(text=word) # 在text控件中显示单词
counter.configure(text='第' + str(self.count) + '个单词') # 在counter控件中显示计数
ans.config(text='')
root.update_idletasks()
try: # 尝试播放单词发音
self.Play_Sound()
except:
pass
def Search_Word(self):
'''
在词库中检索单词并返回释义、发音
'''
global key, word
word = key.get().lower() # 从key控件中获取输入
text.configure(text=word) # 在text控件中显示单词
try: # 若词库中有该词,则显示释义并播放声音,否则 提示未收录
self.Show_Answer()
self.Play_Sound()
except:
ans.config(text='未收录