这是一个分割线
最近在背单词的时候发现一个佷悲催的事情:由于我是用单词本背书,总是会不自觉得看单词的时候同时看到它的意思,所以最后总是记得住单词,记不住它的意思。(其实这个问题一直都存在。。。)
所以就想用python写一个程序来随机输出每天背的单词,这样就不会不自觉的看单词的时候同时看到它的意思,顺便也练习一下学习的代码,免得忘了(老年人啊。。。)。
基本思路:
用tkinter库弹出文件选择对话框
将单词录入txt文档,用open()函数打开保存到列表
随机从列表中取出单词,打印到控制台。并使用requests库从有道词典爬取每个单词的语音文件,通过playsound库播放。
导入库和模块
1importrandom
2importtkinter.filedialog
3importre
4importtime
5importtkinterastk
6importrequests
7importplaysound
8importos
很简单的一个代码实现,但是在实现过程中也遇到了一些问题,解决后也收获了很多。
1.最开始没有导入tkinter库,而是直接导入tkinter.filedialog弹出文件选择框,但是终端运行的时候发现弹出选择框的同时弹出了一个名为tk的对话框,并且这个对话框即使文件选择结束,文件选择对话框关闭,它也不会关闭,强行关闭会导致python停止运行。
解决方法:最后我谷歌查了一下,导入了tkinter库,加入了,这两行代码:
问题解决。
2.在用open()将txt文件转换成列表时,默认了只要取不到内容即停止读取。这样导致读取出来的单词少了一大截。原来在创建txt单词本的时候,不小心在前面某一行留了一个空行。为了防止这种错误发生,加入了这三行代码:
当程序检测到相邻两行空行时退出文件读取。
3.
文件读取结束后打印保存单词的列表时发现每个单词后面有一个“\n”换行符,而且最后两个用于判断文件读取结束的换行符也在列表末尾。
于是导入re模块,用正则表达式除去文件读取中的"\n"换行符。
4.
在从有道爬取语音文件的时候遇到了一个文件管理方面的问题,本来我想的是将语音文件写入一个统一的“word.mp3”文件当中,再传递给playsound库进行播放,播放完成后使用os.remove()将“word.mp3”删除。
但是当我在运行代码的时候发现了一个问题:第一次语音正常播放,第二次语音则报错,提示没有写入权限:
调试了一下发现是文件名的问题,因为在程序正在运行的时候不仅没有将文件删除,而且会将它占用起来,只有在程序运行结束的才会将它们统一删除。
所以在程序中引入一个初始值为0的变量 “i”,每播放一次语音i的值增加 1 。将i作为mp3文件的文件名,并将所有的mp3文件存放于名为binfor的文件夹中。程序运行结束后统一删除。
其实途中还遇到了一些小问题,但是基本上都是在功能添加上的问题,这里就不做记录了。
使用教程:
【使用教程】
1.创建单词表:单词表文件格式为txt,每一行只能有一个单词,而且不能有空格。(安装包中有一个单词表示例)
2.运行程序,选中创建好的单词表,导入即可。
注:由于本程序单词出现由伪随机数函数决定,所以一个单词本里面的单词数量不宜过多,200以下为宜,可以每天创建一个单词表。
运行界面:
(ps:由于懒,就不做GUI(图形用户界面)了, 直接用终端吧......)
源代码:
注:由于程序在运行时会向有道发送下载请求,所以需要在联网条件下使用,而且由于接口的问题,有时候语音下载会有些慢,稍等几秒钟即可。
编程学习,路曼曼其修远兮,吾将上下而求索!
下一篇:追书神器
领取专属 10元无门槛券
私享最新 技术干货