PyQt5--google快捷翻译
一、环境配置
1、在python官网下载windows的python安装包,安装python,记得勾选设置环境变量,否则需要自己去设置。
2、在命令行下输入python,如果有Python的版本号出现,且>>>出现,则说明安装成功,输入exit()退出python命令行模式。
3、安装pip,在命令行下输入:curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
在命令行下输入:python get-pip.py
如果不行可以去下载安装包进行安装:https://pypi.org/project/pip/
4、安装pyqt5:在命令行下输入:pip install pyqt5
5、安装googletrans,在命令行下输入:pip install googletrans
6、如果要打包成exe程序,则在命令行下输入:pip install pyinstaller
安装pyinstaller成功后进入程序放置的目录在命令行下输入:pyinstaller -F 程序名.py
如果需要在显示的窗口下不显示命令行窗口则输入:pyinstaller -F 程序名.py --noconsole
cmd命令行下,输入d:进行磁盘下,其他盘依次对应,输入:cd 文件夹名,进入当前磁盘下的文件夹下。
二、代码
1、导入需要的类
#!/bin/env python3
# -*- coding:utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QGridLayout, QTextEdit, QComboBox, QPushButton
from PyQt5.QtCore import pyqtSignal, QObject, Qt, QThread, QTimer
from googletrans import Translator
其中包含了ui设计界面下的窗口,输入框,显示框,选择框的类
QtCore下需要用到的信号和槽,线程,定时器类
同时也用到了需要的谷歌翻译的类
2、封装谷歌翻译的数据处理
#翻译处理
class GoogleTrans(QObject):
tranOverSignal = pyqtSignal(str)
tranLangsChange = pyqtSignal(str)
def __init__(self):
super().__init__()
#当前要翻译的文本
self.currentText=''
#当前选择的要翻译成的语言
self.currentDest='en'
#设置网址
self.translator = Translator(service_urls=['translate.google.cn'], timeout=3)
self.langs = self.translator.detect(self.currentText)
#获取翻译之后的文本,翻译完成之后会触发翻译完成信号
def getTransText(self):
try:
self.getTransLangs()
text = self.translator.translate(self.currentText,dest=self.currentDest).text
self.tranOverSignal.emit(text)
except:
print('error')
#检测源文本的语言
def getTransLangs(self):
self.langs = self.translator.detect(self.currentText)
self.tranLangsChange.emit(self.langs.lang)
#设置要翻译的文本
def setTransText(self, str):
self.currentText=str;
#设置要翻译的语言
def setCurrentDest(self, str):
if str == '英文':
self.currentDest='en'
elif str == '中文':
self.currentDest='zh-cn'
elif str == '韩语':
self.currentDest='ko'
elif str == '日语':
self.currentDest='ja'
elif str == '法语':
self.currentDest='fr'
elif str == '俄罗斯语':
self.currentDest='ru'
elif str == '荷兰语':
self.currentDest='nl'
elif str == '丹麦语':
self.currentDest='da'
elif str == '阿拉伯语':
self.currentDest='tl'
else:
self.currentDest='en'
#self.getTransText()
对存入的要翻译的文本进行保存,对需要翻译的类型进行保存。因为要实时的翻译,每当文本的内容改变都会调用翻译函数进行翻译,而翻译的过程需要去进行联网获取翻译后的内容,如果输入的过快,会看到UI界面卡顿的情况。因此将翻译的过程放在单独的线程中,这样就不会造成界面卡顿的情况。
3、初始化界面
#主界面
class MainWidget(QWidget):
def __init__(self):
super().__init__()
#输入数据框
self.sourceText = QTextEdit()
#转换完成数据显示框
self.transText = QTextEdit()
#清空翻译内容
self.clearBtn = QPushButton('清空')
#语言选择框
self.selctLanguage = QComboBox()
#延迟转换定时器
self.delayTimer = QTimer()
#转换线程
self.myThread = QThread()
#转换数据处理
self.googletrans = GoogleTrans()
#初始化界面
self.initUI()
def initUI(self):
#设置窗口标题
self.setWindowTitle('Google快捷翻译')
#设置窗体尺寸
self.resize(640, 420)
#对界面进行布局
mainLayout=QGridLayout(self);
mainLayout.addWidget(self.sourceText,0,0)
mainLayout.addWidget(self.clearBtn, 0, 1)
mainLayout.addWidget(self.selctLanguage,1,1)
mainLayout.addWidget(self.transText, 1, 0)
self.setLayout(mainLayout)
#设置显示框没有焦点
self.transText.setFocusPolicy(Qt.NoFocus)
#设置转换语言选择
lanItems=[]
lanItems.append('英文');
lanItems.append('中文');
lanItems.append('韩语');
lanItems.append('日语');
lanItems.append('法语');
self.selctLanguage.addItems(lanItems)
#设置定时器超时只触发一次,初始化定时器
self.delayTimer.setSingleShot(True)
self.delayTimer.stop()
self.delayTimer.timeout.connect(self.timerOutFun)
#清空翻译内容
self.clearBtn.clicked.connect(self.clearSocureText)
#初始化翻译类
self.googletrans.moveToThread(self.myThread)
self.googletrans.tranOverSignal.connect(self.transText.setText)
self.googletrans.tranLangsChange.connect(self.sourceLangChange)
#线程启动之后获取翻译后的文本
self.myThread.started.connect(self.googletrans.getTransText)
self.myThread.finished.connect(self.threadFinished)
#输入框的文字改变时启动翻译
self.sourceText.textChanged.connect(self.sourceTextChange)
#选择的语言改变的时候重新进行翻译
self.selctLanguage.currentTextChanged.connect(self.sourceTextChange)
#清空输入内容
def clearSocureText(self):
self.sourceText.setText('')
#开启定时器,在延迟一定的时间之后才进行翻译,避免翻译速度过快造成界面卡顿
def sourceTextChange(self):
if self.myThread.isRunning():
self.delayTimer.start(200)
else:
self.delayTimer.timeout.emit()
#停止定时器,重新开启线程进行翻译
def timerOutFun(self):
self.delayTimer.stop()
#如果线程正在运行,则停止当前的线程。
if self.myThread.isRunning():
self.myThread.quit()
#self.myThread.wait()
else:
self.myThread.finished.emit()
'''
self.googletrans.setCurrentDest(self.selctLanguage.currentText())
self.googletrans.setTransText(self.sourceText.toPlainText())
self.myThread.start()
'''
def threadFinished(self):
self.googletrans.setCurrentDest(self.selctLanguage.currentText())
self.googletrans.setTransText(self.sourceText.toPlainText())
self.myThread.start()
#源语言改变
def sourceLangChange(self, str):
currentLang = self.selctLanguage.currentText()
if str == 'zh-cn' or str == 'zh-CN':
currentLang = '英文'
elif str == 'en':
currentLang = '中文'
else:
currentLang = '中文'
self.selctLanguage.setCurrentText(currentLang)
如果每次文本改变都去调用翻译的过程,虽然翻译的过程在单独的线程中,但是当当前的翻译没有完成,而退出当前的翻译过程,不进行等待,直接开始新的翻译过程,则会造成翻译结果的丢失,翻译的不完整。如果进行等待,则又会造成界面的卡顿。
因此在处理的过程中添加了一个定时器,如果输入的间隔在200ms以内则不进行翻译,同时重置定时器,在200ms以后再进行翻译,这样虽然会使翻译的结果延长了200ms,但是输入的界面会比较流畅,不会出现卡顿的情况。在这个时间间隔内也不会有明显的翻译延迟。在选择框里对翻译的语言没有全部加进去,如果有需要可以自己添加进去就可以了。
4、主函数
#主函数
if __name__=='__main__':
print("start")
app=QApplication(sys.argv)
w=MainWidget()
w.show()
sys.exit(app.exec_())
主函数的内容就比较简单,申请一个界面,进行显示。
5、效果图
输入是自动识别,输入翻译需要手动去选择。
总结:
一直想自己写个代码,去实现日常的翻译,不用每次都去打开浏览器,找到谷歌翻译,再进行翻译,但是一直纠结于用c++实现对google翻译整个过程的繁琐。用python实现又没有界面的便利,于是迟迟未动手。这两天查找了一下相关的资料对整个过程进行实现。整个过程,是在ubuntu下进行编程调试,最后在windows下进行python的安装打包。在期间对谷歌翻译资料的查找,对应用实现的构思,确定方向,加上写程序花费了差不多一天的时间,虽然比较短小,但是整体的效果还是可以的,输入和翻译的流畅度在能接受的范围内。在程序中用到了QT的信号与槽机制、线程、定时器、Qt常用控件。
2019-03-18更新
1、优化线程处理方式。
2、解决网络连接失败界面无响应的问题。
3、优化中英文翻译自动进行装换,不需要手动切换。
4、新增清空输入按钮。