PyQt编写Google翻译客户端程序
本文主要介绍使用eric开发环境和PyQt开发一个Google翻译客户端程序。
最终效果图:
所使用开发环境:
- Windows XP/Linux
- Python 2.6.4
- eric4 4.3.10
- PyQt4 4.5.3
开发步骤:
步骤一至四主要为eric的操作,我只贴图,详细可参考之前文章提供的参考资料
一.使用eric新建PyQt4工程gtranslate
二.工程中添加窗体,调用QT Designer设计主界面,保存为main.ui
三.编译窗体文件main.ui为Python代码Ui_main.py
四.工程中根据窗体文件生成代码main.py,代码将根据以上生成的Ui类派生,选择需要的信号槽
五.完善main.py,编写核心代码
主要原理:
- Google翻译接口调用参见这里。
- 使用urllib、urllib2来连接网络
- 使用Python2.6的json库来解析返回的json数据
- 翻译模块派生自QT线程类QThread,基础的线程使用,防止界面失去响应
参考代码:
# -*- coding: utf-8 -*-
"""
Module implementing Dialog.
"""
import urllib
import urllib2
import sys
import json
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QDialog
from PyQt4.QtCore import pyqtSignature, SIGNAL, QThread
from Ui_main import Ui_Dialog
class Dialog(QDialog, Ui_Dialog):
"""
Main window
"""
def __init__(self, parent = None):
"""
Constructor
"""
QDialog.__init__(self, parent)
self.setupUi(self)
lang=sorted(GTranslate.LANG.keys())
self.cbOrigin.addItems(lang)
self.cbOrigin.setCurrentIndex(lang.index('ENGLISH'))
self.cbTarget.addItems(lang)
self.cbTarget.setCurrentIndex(lang.index('CHINESE'))
@pyqtSignature("")
def on_btnTranslate_clicked(self):
"""
Submit to google translate
"""
text=self.tOrigin.toPlainText()
text=unicode(text).encode('utf-8')
key=str(self.cbOrigin.currentText())
langOrigin=GTranslate.LANG[key]
key=str(self.cbTarget.currentText())
langTarget=GTranslate.LANG[key]
self.gt=GTranslate(langOrigin, langTarget, text)
self.connect(self.gt, SIGNAL("finished()"), self.showResult)
self.gt.start()
self.updateUi(False)
@pyqtSignature("")
def on_btnReset_clicked(self):
"""
Reset the UI
"""
self.gt.terminate()
self.updateUi(True)
def showResult(self):
result=self.gt.result
if(result):
self.tTarget.setText(result)
self.updateUi(True)
def updateUi(self, enable):
self.btnTranslate.setEnabled(enable)
self.btnReset.setEnabled(not enable)
class GTranslate(QThread):
def __init__(self, langOrigin='en', langTarget='zh', text=None, parent=None):
QThread.__init__(self, parent)
self.text=text
self.langOrigin=langOrigin
self.langTarget=langTarget
self.result=None
def translate(self):
query = (GTranslate.URL % (urllib.quote(self.text), self.langOrigin, self.langTarget))
req = urllib2.Request(query)
# req.add_header("Referer", "http://www.my-ajax-site.com")
try:
r = urllib2.urlopen(req)
data = r.read()
except:
self.result='Network Connect Error!'
return
obj = json.loads(data)
if obj['responseStatus'] != 200L:
self.result="Error: %s" % obj['responseDetails']
else:
self.result=obj['responseData']['translatedText']
def run(self):
self.translate()
URL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=%s&langpair=%s%%7C%s"
LANG={
'AFRIKAANS' : 'af',
'ALBANIAN' : 'sq',
...
'UNKNOWN' : ''
}
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
main = Dialog()
main.show()
sys.exit(app.exec_())
六.测试、打包和发布
这里使用py2exe打包,以便发布在没有安装Python和PyQt的Windows环境下。打包脚本setup.py如下:
#!/usr/bin/env python
#coding=utf-8
from distutils.core import setup
import py2exe
setup(
data_files=[
#vc9 runtime
'msvcr90.dll',
'msvcp90.dll',
'Microsoft.VC90.CRT.manifest',
],
windows=['main.py'],
options={
"py2exe": {
'includes': ['sip'],
"compressed": True,
# 'bundle_files': 2,
}
}
)
注意最好连VS2008相关的库文件一起打包(Python2.6需要msvcr90.dll,PyQt4需要msvcp90.dll),我已将相关的文件放到源码目录,见打包脚本。
工程文件可到我的网盘下载:
转载请注明:来自vvonder's blog
本文地址:http://vvonderblog.appspot.com/2009/12/23/pyqt-google-translate-client.html
34 条评论
我要留言pugwoo 发表于 2009-12-24 at 13:37 回复 引用
IWebEarn 发表于 2010-01-02 at 13:28 回复 引用
埃菲尔 发表于 2010-01-02 at 13:32 回复 引用
cooerson 发表于 2010-01-03 at 17:08 回复 引用
写的不错啊
houkai 发表于 2010-01-13 at 11:45 回复 引用
pan 发表于 2010-01-27 at 20:26 回复 引用
学习了~
水天一线 发表于 2010-02-07 at 12:18 回复 引用
水果妹 发表于 2010-02-08 at 00:46 回复 引用
TaoGOGO 发表于 2010-02-14 at 12:23 回复 引用
云在天边 发表于 2010-03-05 at 11:35 回复 引用
午夜客 发表于 2010-03-08 at 23:05 回复 引用
mimi 发表于 2010-04-02 at 10:25 回复 引用
huachz 发表于 2010-05-09 at 23:49 回复 引用
闫鹏 发表于 2010-05-10 at 13:36 回复 引用
su 发表于 2010-05-11 at 21:13 回复 引用
iilxy 发表于 2010-05-25 at 00:14 回复 引用
用pyinstaller打包比py2exe要好很多,就是pyinstaller在windows下配置麻烦些
yi_tian 发表于 2010-05-30 at 23:46 回复 引用
老魏 发表于 2010-06-01 at 18:59 回复 引用
另外赞下博主,将程序编写的过程大概写出来了。对于我这样的低手来说,没有比这更直接有帮助的了。虽然没有上没有基础知识,但是作为入门也是很好的。
dengmin 发表于 2010-06-19 at 15:31 回复 引用
ANGO 发表于 2010-06-20 at 14:11 回复 引用
qqq 发表于 2010-06-24 at 17:40 回复 引用
打开就出现“A server error occurred. Please contact the administrator.”
如果解决 谢谢!
空空 发表于 2010-06-28 at 16:08 回复 引用
mdjhny 发表于 2010-07-10 at 04:19 回复 引用
用eric加pdb基本可以,当然如果用eclipse+pdb就更无敌了
迷失 发表于 2010-07-10 at 14:10 回复 引用
在打开xheditor编辑器的情况下,
使用回复和引用功能失效。
关闭xheditor编辑器时又出现回复和引用的内容。
我现在正在解决这个问题。已经向houkai请教。
武汉房地产网 发表于 2010-07-12 at 16:59 回复 引用
你好,博主,非常喜欢你的文章 , 希望博主回访!!能多多交流,以后会经常来看看的!
Lambert 发表于 2010-07-16 at 17:51 回复 引用
night 发表于 2010-07-26 at 13:10 回复 引用
LeapPage 发表于 2010-07-26 at 18:32 回复 引用
fyouck 发表于 2010-08-16 at 21:05 回复 引用
健通网络 发表于 2010-08-18 at 19:32 回复 引用
qhm123 发表于 2010-09-04 at 20:22 回复 引用
Code之行人 发表于 2010-10-11 at 09:37 回复 引用
抛丸机 发表于 2011-02-17 at 14:27 回复 引用
Coach Bags 发表于 2011-05-14 at 15:54 回复 引用