设为首页 加入收藏

TOP

PyQt5--google快捷翻译
2019-03-19 14:32:37 】 浏览:51
Tags: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、新增清空输入按钮。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇入门Python,学习资料推荐 下一篇python学习视频下载地址全套

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目