设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 12155|回复: 9
打印 上一主题 下一主题

自己定制的“单词听写软件”

[复制链接]

1

主题

0

好友

34

积分

新手上路

Rank: 1

跳转到指定楼层
楼主
发表于 2013-9-9 15:20:34 |只看该作者 |倒序浏览
初衷:
我觉得自己的英语水平现在受限于词汇量,我不喜欢拿着单词书整本整本的背单词。
更适合我的英语学习方法是,在阅读英语文章或者看美剧的过程中,不放过那些比较好的单词或用法,然后把它记录下来(我用evernote)。白天用零散的时间(比如吃饭时,蹲坑时)多多记忆,晚上睡觉前再汇总地记一遍。效果感觉很不错,效率高,记的单词知道怎么去用。
有个很无奈的就是每次自己记单词时必须先看一眼这个单词,然后去默写。这种方式很不让人放心,你说吧,先看了一眼单词,然后再写出来,怎么知道自己到底是记没记住这个单词?如果不去看那更惨,你都不知道自己要记哪个单词。怎么办呢??

看了crossin系列文章后,又在网络上找到了”获取有道词典单词发音MP3文件的接口”,我发现自己可以用python写个功能定制的”单词听写软件“啊,甚至可以配合着evernote来使用。编写自己实用工具的同时还能练习python编程,多么好啊!

软件描叙:
我构想的软件是这样的:
我把单词或词组记录在evernote的笔记里面,约定每个单词以“;”隔开。
evernote里面的笔记可以导出为XML文件,而python是可以解析XML的。
程序有GUI(界面),约定好XML文件的路径后可以自动加载,解析出各个单词。通过点击“下一个、上一个”按钮可以依次发出单词读音,下面有输入框,输入单词的拼写、点击“check”按钮可以检验自己单词写正确了没有。由于有道词典提供英式和美式两种发音,还可以选择不同的发音。

我的进度:
有这个想法蛮久了,最近也在折腾各种编程环境,现在各种情况如下:
语言:python2.7.3,GUI编程选择了pyqt4。
编程环境:ubuntu12.04 + eclipse4.2 + pydev插件。
很多东西都是第一次使用,安装测试的过程中遇到好多问题,各种看文档,各种找资料,好多都是英文的,更加坚定了我要做出这个学习英文工具的决心。

现在我已经能通过有道词典接口获取MP3文件,通过pyqt4的phonon模块发音,通过qt4进行简单的按键响应,也能够用python解析出XML文件里面的每个单词了,也就是所有技术难题上的测试都通过了。剩下的,就是编写一个完整程序了。

为什么要贴在这里:
毕竟我这个程序是完全为满足个人需要而编写的,我不知道有多少人会感兴趣,或者是不是没有人感兴趣。
但看到corssin先生创建这么个板块,每个人都可以不受限制的提出问题回答问题,或者是自己回答自己的问题。这个想法让我很受鼓舞,我把自己写这个程序的过程和经验贴在这里,就算只是活跃了这个板块也不错啦!

如果对这个程序的功能恰好感兴趣的同学(比如你也希望这么背单词),如果你觉得功能上或设计上还有什么好建议也可以告诉我哦。如果我能实现你想要的功能说不定特地做好了发给你!

如果有同学还愿意接受“挑战”而一起做的话,那就不知道我有多么开心了。



  
回复

使用道具 举报

2

主题

0

好友

71

积分

注册会员

Rank: 2

沙发
发表于 2013-9-10 18:16:03 |只看该作者
LZ想法很好!我觉得你前期的进度已经说明了你的决心,后边编程应该花不了太久的!
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

板凳
发表于 2013-9-13 02:06:02 |只看该作者
点赞!

lz的计划很详细
我一般做这种程序,也是喜欢先用非常简单的界面,或者甚至直接命令行下,把核心的功能给解决掉
看lz的进度,应该已经完成了这一步了。

希望看到后续进展,早日完工
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

1

主题

0

好友

34

积分

新手上路

Rank: 1

地板
发表于 2013-9-13 09:08:44 |只看该作者
本帖最后由 大子雄 于 2013-9-13 10:19 编辑

两天前完成了这个程序。程序一共有3个类,一个main函数。其中两个类是写GUI的,如果不是用pyqt,很多东西可能不好懂(qt的信号与槽,qt designer自动生成的类等等),我觉得不适合贴在这里,用qt的如果感兴趣可以找我要(不过我界面也是相当没艺术感)。
所以我贴一个专门从XML文件中分析与提取单词的类WordsHandler在这里。而且我把这个类中与qt有关的内容也删除了,但不影响这个类的完整性。
  1. import xml.dom.minidom
  2. import re

  3. #此类用于从XML中解析出单词list,并提供获取单个单词的公共方法
  4. class WordsHandler():
  5.     url = "word.xml" #xml文件的地址
  6.    
  7.     def __init__(self):
  8.         self.index = 0  #记录在单词list中的位置
  9.         
  10.     #此类生成单词list
  11.     def initWordsList(self):
  12.         self.wordsString = ""
  13.         self.wordsList = []
  14.         dom = xml.dom.minidom.parseString(self.getXMLString())#由内容为xml的string解析xml文件
  15.         node = dom.documentElement
  16.         
  17.         self._generateWordsString(node)#生成所有单词组成的string
  18.         self.wordsList = self._generateWordsList(self.wordsString)#由string生成wordlist
  19.         
  20.     #此类从原xml文件中取出CDATA中的字符串
  21.     #说明:知道xml的应该知道CDATA,evernote导出的xml文件把实际内容存放在CDATA中,实际内容也是XML
  22.     #用正则表达式匹配出CDATA内容
  23.     def getXMLString(self):
  24.         s = open(self.url).read()
  25.         rgx = re.compile("(?<=\<\!\[CDATA\[)[\s\S]*(?=\]\]>)")
  26.         m = rgx.search(s)
  27.         return m.group(0)
  28.         
  29.     #用递归的方法遍历XML所有结点,如果节点类型为文本,把文本内容存放到wordsString
  30.     def _generateWordsString(self, node):
  31.         if node.nodeType == 3:
  32.             self.wordsString += node.nodeValue
  33.         elif node.hasChildNodes() == True:
  34.             for childNode in node.childNodes:
  35.                 self._generateWordsString(childNode)
  36.                
  37.     #从wordsString生成wordsList
  38.     def _generateWordsList(self,wordsString):
  39.         wordsList = []
  40.         tmpList = wordsString.split(";")
  41.         for word in tmpList:
  42.             if word != "":
  43.                 wordsList.append(word)
  44.         return wordsList
  45.    
  46.     #获取index指向的单词
  47.     def getWord(self):
  48.         return self.wordsList[self.index]

  49.     #index指向下一个单词
  50.     def setNextWord(self):
  51.         if self.index < len(self.wordsList) - 1:
  52.             self.index += 1
  53.         
  54.     #index指向上一个单词
  55.     def setLastWord(self):
  56.         if self.index > 0:
  57.             self.index -= 1
复制代码
再贴一个在GUI类中专门控制发声的方法,因为可以从中看出”有道词典“的接口。
  1.     def makeAudio(self):
  2.         word = self.wordsHandler.getWord()
  3.         url = "http://dict.youdao.com/dictvoice?audio=%s&type=%s" %(word, self.audioStyle)#word为单词字符串,audioStyle为1时是英式发音,为2时是美式发音
  4.         self.mediaObject.setCurrentSource(Phonon.MediaSource(QtCore.QUrl(url)))
  5.         self.mediaObject.play()
复制代码
界面相当简陋,就是最下面那张张图啦

感兴趣的可以向我要哦(不管有没有~~~)
不管怎么说,这是我第一个python程序,收获还是挺大的。
第一:起码提高了自己看文档的能力,搭建编程环境还是看了不少英文文档的,遇到过很多问题都解决了(还把我从windows逼到了ubuntu)。
第二:这是我python写的第一个实际项目,不能不说提高了对python的认识。
第三:了解了qt的信号与槽机制
第四:为了分析xml中的CDATA内容,特地去看了正则表达式,以前经常听说,现在才对正则表达式有了初步的了解。

不错!

Screenshot from 2013-09-13 10:17:09.png (693.2 KB, 下载次数: 336)

Screenshot from 2013-09-13 10:17:09.png

回复

使用道具 举报

0

主题

0

好友

84

积分

注册会员

Rank: 2

5#
发表于 2013-9-13 13:27:23 |只看该作者
大子雄 发表于 2013-9-13 09:08
两天前完成了这个程序。程序一共有3个类,一个main函数。其中两个类是写GUI的,如果不是用pyqt,很多东西可 ...

真牛,看得我好激动〜
回复

使用道具 举报

0

主题

0

好友

62

积分

注册会员

Rank: 2

6#
发表于 2013-9-29 14:11:32 |只看该作者
我是从0开始的,最开始接触的就是Qt,然后是linux,以及环境搭建,还有跨平台编译。然后总是遇到问题才去解决的,基础太差。然后就是碰到先生以及在这个论坛以及微信上慢慢的学习。
回复

使用道具 举报

2

主题

0

好友

154

积分

注册会员

Rank: 2

7#
发表于 2013-10-11 17:01:01 |只看该作者
必须点赞啊
回复

使用道具 举报

0

主题

0

好友

20

积分

新手上路

Rank: 1

8#
发表于 2013-10-13 13:02:17 |只看该作者
太棒啦 楼主。真正的学有所用。看好你
回复

使用道具 举报

0

主题

0

好友

134

积分

注册会员

Rank: 2

9#
发表于 2013-12-13 23:23:50 |只看该作者
赞~~~~~~~~~
回复

使用道具 举报

0

主题

0

好友

4

积分

新手上路

Rank: 1

10#
发表于 2019-10-9 15:47:24 来自手机 |只看该作者
我想问你要这个单词听写软件可以不
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-5-3 16:43 , Processed in 0.027886 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部