想法来源:每次翻译论文时,直接复制粘贴,会有很多回车、多个空格等,格式比较乱,于是写了这个小工具。
主要功能:英汉互译,ctrl+enter自动格式化并翻译;ctrl+鼠标滚轮更改字体大小。
实现思路:
1、主要功能:
1)获取左边输入框的文本,将其中的多个空格替换为一个空格,将其中的回车替换为一个空格;2)根据组合框中内容选择语言;3)连接谷歌翻译网址进行翻译;4)分别将格式化的原文与译文显示在界面上
2、基础功能:
1)重写键盘事件,利用ctrl+enter控制文本格式化与翻译;2)重写鼠标滚轮事件,利用ctrl+鼠标滚轮控制字体大小
操作实例:一个动图
源代码:
# yangzhen
# 2021.12.3
# 英汉互译GUI
from PyQt5 import QtCore, QtGui, QtWidgets
import re
import html
from urllib import parse
import requests
import sys
import os
class Ui_Form(QtWidgets.QWidget):
GOOGLE_TRANSLATE_URL = 'http://translate.google.cn/m?q=%s&tl=%s&sl=%s'
def __init__(self):
super().__init__()
self.resize(1200, 800)
self.setWindowTitle('文本翻译')
icon = QtGui.QIcon()
if getattr(sys, 'frozen', False):
application_path = os.path.dirname(sys.executable)
elif __file__:
application_path = os.path.dirname(__file__)
icon.addPixmap(QtGui.QPixmap(application_path + "/icon.png"),
QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.setWindowIcon(icon)
self.verticalLayout = QtWidgets.QVBoxLayout(self)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.oldlanguage = QtWidgets.QComboBox(self)
self.oldlanguage.setObjectName("oldlanguage")
items = ["英文", "中文"]
self.oldlanguage.addItems(items)
self.oldlanguage.setCurrentIndex(0) # 设置默认值
self.horizontalLayout_6.addWidget(self.oldlanguage)
spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_6.addItem(spacerItem)
self.horizontalLayout_5.addLayout(self.horizontalLayout_6)
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.newlanguage = QtWidgets.QComboBox(self)
self.newlanguage.setObjectName("newlanguage")
self.newlanguage.addItems(items)
self.newlanguage.setCurrentIndex(1) # 设置默认值
self.horizontalLayout_7.addWidget(self.newlanguage)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_7.addItem(spacerItem1)
self.horizontalLayout_5.addLayout(self.horizontalLayout_7)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
self.horizontalLayout_8.setObjectName("horizontalLayout_8")
self.oldtext = QtWidgets.QTextEdit(self)
self.oldtext.setObjectName("oldtext")
self.horizontalLayout_8.addWidget(self.oldtext)
self.newtext = QtWidgets.QTextEdit(self)
self.newtext.setObjectName("newtext")
self.horizontalLayout_8.addWidget(self.newtext)
self.verticalLayout.addLayout(self.horizontalLayout_8)
font = QtGui.QFont()
font.setFamily('Microsoft YaHei')
font.setPointSize(10)
self.oldtext.setFont(font)
self.newtext.setFont(font)
self.textsize = 10
self.oldlanguage.setFont(font)
self.newlanguage.setFont(font)
def keyPressEvent(self, event):
"""重写键盘事件"""
# print(self.GOOGLE_TRANSLATE_URL)
key = event.key()
moder = event.modifiers()
if key == QtCore.Qt.Key_Return:
if moder == QtCore.Qt.ControlModifier:
# 格式化原文
text1 = self.oldtext.toPlainText()
text1 = self.formattext(text1)
# print(text1)
# 获取语言
text_label = self.oldlanguage.currentText()
if text_label == "英文":
text_language = 'en'
else:
text_language = 'zh-CN'
to_label = self.newlanguage.currentText()
if to_label == "英文":
to_language = 'en'
else:
to_language = 'zh-CN'
# 翻译
text2 = self.translate(text1, text_language, to_language)
# print(text2)
# 显示结果
self.oldtext.setText(text1)
self.newtext.setText(text2)
def wheelEvent(self, event):
"""重写鼠标事件"""
if (event.modifiers() == QtCore.Qt.ControlModifier):
font = QtGui.QFont()
font.setFamily('Microsoft YaHei')
if (event.angleDelta().y() > 0.5):
self.textsize += 1
# self.scaleflag = 1
elif (event.angleDelta().y() < 0.5):
self.textsize -= 1
font.setPointSize(self.textsize)
self.oldtext.setFont(font)
self.newtext.setFont(font)
def translate(self, text, text_language="auto", to_language="auto"):
"""翻译"""
text = parse.quote(text)
url = self.GOOGLE_TRANSLATE_URL % (text, to_language, text_language)
response = requests.get(url)
data = response.text
expr = r'(?s)class="(?:t0|result-container)">(.*?)<'
result = re.findall(expr, data)
if (len(result) == 0):
return "错误"
return html.unescape(result[0])
def formattext(self, text):
"""原文格式化"""
text = text.replace('-', '')
text = text.replace('\n', ' ')
text = ' '.join(text.split())
return text
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
ui = Ui_Form()
# ui.InitiaWindow(MainWindow)
ui.show()
sys.exit(app.exec_())
已经打包好的exe:
链接:https://pan.baidu.com/s/15qVMsVPKqHYxA62Sno4mDQ
提取码:1234
参考: