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),我已将相关的文件放到源码目录,见打包脚本。

工程文件可到我的网盘下载:

工程源码py2exe打包版


转载请注明:来自vvonder's blog
本文地址:http://vvonderblog.appspot.com/2009/12/23/pyqt-google-translate-client.html



34 条评论

我要留言
  • 1 F

    pugwoo 发表于 2009-12-24 at 13:37 回复 引用

    good,先留言,再下载
  • 2 F

    IWebEarn 发表于 2010-01-02 at 13:28 回复 引用

    我也收藏一下,很好,学习啦Handshake我做过一个留言本的
  • 3 F

    埃菲尔 发表于 2010-01-02 at 13:32 回复 引用

    好东西,收藏
  • 4 F

    cooerson 发表于 2010-01-03 at 17:08 回复 引用

    @埃菲尔-65002:
    写的不错啊
  • 5 F

    houkai 发表于 2010-01-13 at 11:45 回复 引用

    这段时间忙完 也玩玩pyQT qt确实不错的!
  • 6 F

    pan 发表于 2010-01-27 at 20:26 回复 引用

    @houkai-67001:
    学习了~
  • 7 F

    水天一线 发表于 2010-02-07 at 12:18 回复 引用

    哇,太厉害啦,顶
  • 8 F

    水果妹 发表于 2010-02-08 at 00:46 回复 引用

    我来回踩了博主新年快乐
  • 9 F

    TaoGOGO 发表于 2010-02-14 at 12:23 回复 引用

    送上祝福给vvonder,哈哈,新年快乐哈
  • 10 F

    云在天边 发表于 2010-03-05 at 11:35 回复 引用

    好久不见你更新啦
  • 11 F

    午夜客 发表于 2010-03-08 at 23:05 回复 引用

    要能一銉互换 英文-汉字 这样才方便呀!
  • 12 F

    mimi 发表于 2010-04-02 at 10:25 回复 引用

    牛人啊!佩服!
  • 13 F

    huachz 发表于 2010-05-09 at 23:49 回复 引用

    怎么想个方法移植这个项目到N手机上?
  • 14 F

    闫鹏 发表于 2010-05-10 at 13:36 回复 引用

    我觉得这个主要的应用还是开发升序,gooogle翻译可能作用不是非常大啊
  • 15 F

    su 发表于 2010-05-11 at 21:13 回复 引用

    Smile呵呵 学IT的都好厉害哦啊 什么程序都写得出来
  • 16 F

    iilxy 发表于 2010-05-25 at 00:14 回复 引用

    不能下载了,我照着楼主的代码自己写了一个
    用pyinstaller打包比py2exe要好很多,就是pyinstaller在windows下配置麻烦些
  • 17 F

    yi_tian 发表于 2010-05-30 at 23:46 回复 引用

    很棒啊,顶了
  • 18 F

    老魏 发表于 2010-06-01 at 18:59 回复 引用

    博主学习python的过程是怎么样的?
    另外赞下博主,将程序编写的过程大概写出来了。对于我这样的低手来说,没有比这更直接有帮助的了。虽然没有上没有基础知识,但是作为入门也是很好的。
  • 19 F

    dengmin 发表于 2010-06-19 at 15:31 回复 引用

    pyqt很少用,毕竟工作中没用要这快,但可以学习学习
  • 20 F

    ANGO 发表于 2010-06-20 at 14:11 回复 引用

    ding
  • 21 F

    qqq 发表于 2010-06-24 at 17:40 回复 引用

    刚刚上传
    打开就出现“A server error occurred. Please contact the administrator.”
    如果解决 谢谢!
  • 22 F

    空空 发表于 2010-06-28 at 16:08 回复 引用

    python调试感觉比较麻烦, 不知道大家是怎么看的?
  • 23 F

    mdjhny 发表于 2010-07-10 at 04:19 回复 引用

    @空空-152001:
    用eric加pdb基本可以,当然如果用eclipse+pdb就更无敌了
  • 24 F

    迷失 发表于 2010-07-10 at 14:10 回复 引用

    不知道作者有没有发现一个bug,
    在打开xheditor编辑器的情况下,
    使用回复和引用功能失效。
    关闭xheditor编辑器时又出现回复和引用的内容。

    我现在正在解决这个问题。已经向houkai请教。
  • 25 F

    武汉房地产网 发表于 2010-07-12 at 16:59 回复 引用


    你好,博主,非常喜欢你的文章 , 希望博主回访!!能多多交流,以后会经常来看看的!

  • 26 F

    Lambert 发表于 2010-07-16 at 17:51 回复 引用

    前段时间写了个小软件搞起玩。。。觉得wxPython还蛮不错的
  • 27 F

    night 发表于 2010-07-26 at 13:10 回复 引用

    软件不错,方便很多。
  • 28 F

    LeapPage 发表于 2010-07-26 at 18:32 回复 引用

    我也是在GAE上做的Micolo博客,文章发布的时候,主页预览的时候的PNG图片可以显示,但是点开文章之后就不显示了,请问大家还有这样的问题么?怎么处理?
  • 29 F

    fyouck 发表于 2010-08-16 at 21:05 回复 引用

    不知道支不支持在pdf上面选词呢?
  • 30 F

    健通网络 发表于 2010-08-18 at 19:32 回复 引用

    LZ好文章啊
  • 31 F

    qhm123 发表于 2010-09-04 at 20:22 回复 引用

    顶,学到很多
  • 32 F

    Code之行人 发表于 2010-10-11 at 09:37 回复 引用

    恩,不错的。改天我试试看
  • 33 F

    抛丸机 发表于 2011-02-17 at 14:27 回复 引用

    顶,学到很多
  • 34 F

    Coach Bags 发表于 2011-05-14 at 15:54 回复 引用

    java功底不错哦!