- 帖子
- 3
- 精华
- 0
- 积分
- 34
- 阅读权限
- 10
- 注册时间
- 2013-7-26
- 最后登录
- 2013-9-20
|
本帖最后由 大子雄 于 2013-9-13 10:19 编辑
两天前完成了这个程序。程序一共有3个类,一个main函数。其中两个类是写GUI的,如果不是用pyqt,很多东西可能不好懂(qt的信号与槽,qt designer自动生成的类等等),我觉得不适合贴在这里,用qt的如果感兴趣可以找我要(不过我界面也是相当没艺术感)。
所以我贴一个专门从XML文件中分析与提取单词的类WordsHandler在这里。而且我把这个类中与qt有关的内容也删除了,但不影响这个类的完整性。- import xml.dom.minidom
- import re
- #此类用于从XML中解析出单词list,并提供获取单个单词的公共方法
- class WordsHandler():
- url = "word.xml" #xml文件的地址
-
- def __init__(self):
- self.index = 0 #记录在单词list中的位置
-
- #此类生成单词list
- def initWordsList(self):
- self.wordsString = ""
- self.wordsList = []
- dom = xml.dom.minidom.parseString(self.getXMLString())#由内容为xml的string解析xml文件
- node = dom.documentElement
-
- self._generateWordsString(node)#生成所有单词组成的string
- self.wordsList = self._generateWordsList(self.wordsString)#由string生成wordlist
-
- #此类从原xml文件中取出CDATA中的字符串
- #说明:知道xml的应该知道CDATA,evernote导出的xml文件把实际内容存放在CDATA中,实际内容也是XML
- #用正则表达式匹配出CDATA内容
- def getXMLString(self):
- s = open(self.url).read()
- rgx = re.compile("(?<=\<\!\[CDATA\[)[\s\S]*(?=\]\]>)")
- m = rgx.search(s)
- return m.group(0)
-
- #用递归的方法遍历XML所有结点,如果节点类型为文本,把文本内容存放到wordsString
- def _generateWordsString(self, node):
- if node.nodeType == 3:
- self.wordsString += node.nodeValue
- elif node.hasChildNodes() == True:
- for childNode in node.childNodes:
- self._generateWordsString(childNode)
-
- #从wordsString生成wordsList
- def _generateWordsList(self,wordsString):
- wordsList = []
- tmpList = wordsString.split(";")
- for word in tmpList:
- if word != "":
- wordsList.append(word)
- return wordsList
-
- #获取index指向的单词
- def getWord(self):
- return self.wordsList[self.index]
- #index指向下一个单词
- def setNextWord(self):
- if self.index < len(self.wordsList) - 1:
- self.index += 1
-
- #index指向上一个单词
- def setLastWord(self):
- if self.index > 0:
- self.index -= 1
复制代码 再贴一个在GUI类中专门控制发声的方法,因为可以从中看出”有道词典“的接口。- def makeAudio(self):
- word = self.wordsHandler.getWord()
- url = "http://dict.youdao.com/dictvoice?audio=%s&type=%s" %(word, self.audioStyle)#word为单词字符串,audioStyle为1时是英式发音,为2时是美式发音
- self.mediaObject.setCurrentSource(Phonon.MediaSource(QtCore.QUrl(url)))
- self.mediaObject.play()
复制代码 界面相当简陋,就是最下面那张张图啦
感兴趣的可以向我要哦(不管有没有~~~)
不管怎么说,这是我第一个python程序,收获还是挺大的。
第一:起码提高了自己看文档的能力,搭建编程环境还是看了不少英文文档的,遇到过很多问题都解决了(还把我从windows逼到了ubuntu)。
第二:这是我python写的第一个实际项目,不能不说提高了对python的认识。
第三:了解了qt的信号与槽机制
第四:为了分析xml中的CDATA内容,特地去看了正则表达式,以前经常听说,现在才对正则表达式有了初步的了解。
不错! |
|