You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

973 lines
47 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import sys
from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets, QtCore, QtGui#绘制界面用到的模块
from PyQt5.QtCore import Qt, QFile
from faker import Faker#爬取有道翻译用到的模块
import time
import random
import hashlib
import requests
from PyQt5.QtWidgets import QFileDialog, QDesktopWidget, QMainWindow # 调用系统文本选择框用到的模块
import docx as docx#读取docx文档用到的模块
import pyperclip#读取pdf文件用到的模块
import pdfplumber as pdfplumber
from win32com import client#将docx文件转化为pdf文件doc文件转化为docx文件用到的模块
import os#有关路径问题的模块
from aip import AipOcr#调用百度文字识别用到的模块
from PyQt5.QtGui import QIcon#设置图标用到的模块
import execjs#运行js文件的模块
from PyQt5.QtWidgets import QWidget#绘制悬浮窗用到的模块
from PyQt5.QtGui import QCursor, QMouseEvent#设置鼠标的形状,重写移动事件用到的模块
from PyQt5.QtCore import QPoint, QPropertyAnimation, QRect#设置动画用到的模块
# import keyboard
# from translation import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1400, 1000)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setGeometry(QtCore.QRect(10, 10, 1371, 941))
self.widget.setObjectName("widget")
self.verticalLayout_5 = QtWidgets.QVBoxLayout(self.widget)
self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_5.setObjectName("verticalLayout_5")
self.verticalLayout_4 = QtWidgets.QVBoxLayout()
self.verticalLayout_4.setObjectName("verticalLayout_4")
self.verticalLayout_2 = QtWidgets.QVBoxLayout()
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.select_ = QtWidgets.QComboBox(self.widget)
font = QtGui.QFont()
font.setPointSize(12)
self.select_.setFont(font)
self.select_.setObjectName("select_")
self.select_.addItem("")
self.select_.addItem("")
self.verticalLayout_2.addWidget(self.select_)
self.select = QtWidgets.QComboBox(self.widget)
font = QtGui.QFont()
font.setPointSize(12)
self.select.setFont(font)
self.select.setObjectName("select")
self.select.addItem("")
self.select.addItem("")
self.verticalLayout_2.addWidget(self.select)
self.verticalLayout_4.addLayout(self.verticalLayout_2)
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.language = QtWidgets.QComboBox(self.widget)
font = QtGui.QFont()
font.setPointSize(12)
self.language.setFont(font)
self.language.setObjectName("language")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.language.addItem("")
self.verticalLayout_3.addWidget(self.language)
self.language_ = QtWidgets.QComboBox(self.widget)
font = QtGui.QFont()
font.setPointSize(12)
self.language_.setFont(font)
self.language_.setObjectName("language_")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.language_.addItem("")
self.verticalLayout_3.addWidget(self.language_)
self.verticalLayout_4.addLayout(self.verticalLayout_3)
self.verticalLayout_5.addLayout(self.verticalLayout_4)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.translation = QtWidgets.QTextEdit(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.translation.setFont(font)
self.translation.setObjectName("translation")
self.horizontalLayout_3.addWidget(self.translation)
self.translationresult = QtWidgets.QTextBrowser(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.translationresult.setFont(font)
self.translationresult.setObjectName("translationresult")
self.horizontalLayout_3.addWidget(self.translationresult)
self.verticalLayout_5.addLayout(self.horizontalLayout_3)
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.translate = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.translate.setFont(font)
self.translate.setObjectName("translate")
self.horizontalLayout_2.addWidget(self.translate)
self.clear = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.clear.setFont(font)
self.clear.setObjectName("clear")
self.horizontalLayout_2.addWidget(self.clear)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.copy = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.copy.setFont(font)
self.copy.setObjectName("copy")
self.horizontalLayout.addWidget(self.copy)
self.paste = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.paste.setFont(font)
self.paste.setObjectName("paste")
self.horizontalLayout.addWidget(self.paste)
self.signup = QtWidgets.QPushButton(self.widget)
font = QtGui.QFont()
font.setPointSize(16)
self.signup.setFont(font)
self.signup.setObjectName("signup")
self.horizontalLayout.addWidget(self.signup)
self.verticalLayout.addLayout(self.horizontalLayout)
self.verticalLayout_5.addLayout(self.verticalLayout)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1400, 26))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.a_open_file = QtWidgets.QAction(MainWindow)
self.a_open_file.setObjectName("a_open_file")
self.a_save_file = QtWidgets.QAction(MainWindow)
self.a_save_file.setObjectName("a_save_file")
self.a_about_ = QtWidgets.QAction(MainWindow)
self.a_about_.setObjectName("a_about_")
self.menu.addAction(self.a_open_file)
self.menu.addAction(self.a_save_file)
self.menu.addAction(self.a_about_)
self.menubar.addAction(self.menu.menuAction())
self.retranslateUi(MainWindow)
self.a_open_file.triggered.connect(self.open_file)
self.a_save_file.triggered.connect(self.save_file)
self.a_about_.triggered.connect(self.about_)
self.translate.clicked.connect(self.fanyi)
self.clear.clicked.connect(self.translationresult.clear)
self.clear.clicked.connect(self.translation.clear)
self.paste.clicked.connect(self.translation.paste)
self.copy.clicked.connect(self.copy_)
self.signup.clicked.connect(MainWindow.close)
self.translation.textChanged.connect(self.read_)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
MainWindow.setWindowIcon(QIcon('./tubiao.ico'))#设置图标
self.translation.setStyleSheet("border-image:url(./background1.jpg);color:white")#设置文本框的背景图片和文字颜色
self.translationresult.setStyleSheet("border-image:url(./background.jpg);color:white")
# MainWindow.setStyleSheet("#MainWindow{border-image:url(./background.jpg);}")#设置窗体的背景图片(自适应)
# MainWindow.setStyleSheet("#MainWindow{background-image: url(./background.jpg);}")#设置窗体的背景图片
# self.translate.setStyleSheet("QPushButton{border-image: url(./background.jpg)}")#设置按钮的背景图片
# MainWindow.setWindowOpacity(0.5)#设置窗口透明度
# MainWindow.setAttribute(QtCore.Qt.WA_TranslucentBackground)#设置窗口背景透明
# op = QtWidgets.QGraphicsOpacityEffect()#设置控件的透明度透明度的值0.0到1.0最小值0是透明1是不透明
# op.setOpacity(0.5)
# self.translate.setGraphicsEffect(op)
# self.translate.setAutoFillBackground(True)
MainWindow.setWindowFlags(Qt.WindowMinimizeButtonHint | Qt.WindowCloseButtonHint | Qt.MSWindowsFixedSizeDialogHint)#设置窗体只有最小化和关闭按钮,固定窗体的大小
MainWindow.setStyleSheet("#MainWindow{background-color:black}")#设置窗体的背景颜色
self.language.setStyleSheet('background:black;color:white;')#设置控件的背景颜色和字体颜色
self.language_.setStyleSheet('background:black;color:white;')
self.select.setStyleSheet('background:black;color:white;')
self.select_.setStyleSheet('background:black;color:white;')
self.translate.setStyleSheet("QPushButton{background:black;color:white;border-radius:5px;}QPushButton:hover{background:white;color:gray;}")#设置控件的背景颜色和字体大小,以及复合事件
self.clear.setStyleSheet("QPushButton{background:black;color:white;border-radius:5px;}QPushButton:hover{background:white;color:gray;}")
self.copy.setStyleSheet("QPushButton{background:black;color:white;border-radius:5px;}QPushButton:hover{background:white;color:gray;}")
self.paste.setStyleSheet("QPushButton{background:black;color:white;border-radius:5px;}QPushButton:hover{background:white;color:gray;}")
self.signup.setStyleSheet("QPushButton{background:black;color:white;border-radius:5px;}QPushButton:hover{background:white;color:gray;}")
# MainWindow.setGeometry(200, 200, 1400, 1000)
# # 获取屏幕坐标系
# screen = QDesktopWidget().screenGeometry() # 得到屏幕的坐标系
# # 获取窗口坐标系
# size = MainWindow.geometry()
# newLeft = (screen.width() - size.width()) / 2 # 计算
# newTop = (screen.height() - size.height()) / 2
#
# MainWindow.move(int(newLeft), int(newTop)-42)
# 输出内容到textbrowser上
def printf(self, str):
self.translationresult.append(str)#在指定的区域显示提示信息
self.cursor = self.translationresult.textCursor()
self.translationresult.moveCursor(self.cursor.End)#光标移到最后,这样就会自动显示出来
QtWidgets.QApplication.processEvents()#一定加上这个功能,不然有卡顿
# 将内容复制到系统的剪切板上
def copy_(self):
pyperclip.copy(self.translationresult.toPlainText())
# 读取拖拽文件
def read_(self):
if self.translation.toPlainText().find('file:///') == 0:
self.translation.setText(self.translation.toPlainText().replace('file:///', ''))
flag = os.path.splitext(self.translation.toPlainText())[1]#获取路径中的文件类型
if flag == '.jpg' or flag == '.png':
if self.select.currentText() == '图片翻译':
imgs = self.translation.toPlainText()
global imgdict#定义全局变量
global imgpath
imgdict[imgpath] = imgs
self.translation.setText('')
self.translation.append('<img src=' + str(imgs) + '>')#将图片显示到textedit上
self.fanyi()
# jpg = QtGui.QPixmap(imgs).scaled(self.label.width(), self.label.height())#将图片显示到标签上(自适应)
# self.label.setPixmap(jpg)
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag == '.txt':
if self.select.currentText() == '文字翻译':
txtbefore = self.translation.toPlainText()
self.translation.setText('')
f1 = QFile(txtbefore)#创建文件对象,不创建文件对象也不报错 也可以读文件和写文件
f2 = open(str(txtbefore), "r", encoding='UTF-8')#打开路径所对应的文件, "r"以只读的方式 也是默认的方式
txtafter = f2.read()#获取读取docx文件的内容
self.translation.setText(txtafter)
f2.close()
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag == '.docx':
if self.select.currentText() == '文字翻译':
docxbefore = self.translation.toPlainText()
self.translation.setText('')
docxafter = docx.Document(str(docxbefore))#定义对象
for i in range(len(docxafter.paragraphs)):#将docx文件中的内容输出到textedit上
self.translation.append(docxafter.paragraphs[i].text)
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag == '.doc':
if self.select.currentText() == '文字翻译':
wordss = client.Dispatch("Word.Application")
docbefore = self.translation.toPlainText()
self.translation.setText('')
docs = wordss.Documents.Open(docbefore)
zhuanhua = os.path.splitext(docbefore)[0] + str(random.randint(1, 248)) + '.docx'
docs.SaveAs(zhuanhua, 16)#使用参数16表示将doc转换成docx
docs.Close()
wordss.Quit()
file2 = docx.Document(zhuanhua)
for i in range(len(file2.paragraphs)):
self.translation.append(file2.paragraphs[i].text)
os.remove(zhuanhua)#删除转化后的docx文件
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag == '.pdf':
if self.select.currentText() == '文字翻译':
pdfbefore = self.translation.toPlainText()
self.translation.setText('')
pdfafter = pdfplumber.open(pdfbefore)#打开
page = pdfafter.pages#获取pdf文件中所有页的内容
for i in page:#将pdf文件中所有页内容输出到textedit
self.translation.append(i.extract_text())
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
else:
self.translation.setText("暂不提供读取此类型的文件!")
else:
pass
# 读取各种文件
def open_file(self):
self.translation.setText('')
fileName, fileType = QFileDialog.getOpenFileName(self, "读取文件", "./","读取的文件类型(*.txt);;读取的文件类型(*.docx);;读取的文件类型(*.doc);;读取的文件类型(*.pdf);;读取的文件类型(*.jpg);;读取的文件类型(*.png)")#文件选择框
if fileName:
flag2 = os.path.splitext(fileName)[1]
if flag2 == '.txt':
if self.select.currentText() == '文字翻译':
txts = fileName
f3 = QFile(txts)
f4 = open(txts, "r", encoding='UTF-8')
data = f4.read()
self.translation.setText(data)
f4.close()
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag2 == '.docx':
if self.select.currentText() == '文字翻译':
docxs = fileName
file = docx.Document(str(docxs))
for i in range(len(file.paragraphs)):
self.translation.append(file.paragraphs[i].text)
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag2 == '.doc':
if self.select.currentText() == '文字翻译':
words = client.Dispatch("Word.Application")
doc = words.Documents.Open(fileName)
zhuanhua1 = os.path.splitext(fileName)[0] + str(random.randint(1, 248)) + '.docx'
doc.SaveAs(zhuanhua1, 16)
doc.Close()
words.Quit()
file1 = docx.Document(zhuanhua1)
for i in range(len(file1.paragraphs)):
self.translation.append(file1.paragraphs[i].text)
self.fanyi()
os.remove(zhuanhua1)
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag2 == '.pdf':
if self.select.currentText() == '文字翻译':
pdfs = pdfplumber.open(fileName)
pages = pdfs.pages
for i in pages:
self.translation.append(i.extract_text())
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
elif flag2 == '.jpg' or flag2 == '.png':
if self.select.currentText() == '图片翻译':
global imgdict
global imgpath
imgdict[imgpath] = fileName
self.translation.setText('<img src=' + str(fileName) + '>')
self.fanyi()
else:
self.translation.setText("读取的文件类型与翻译的文件类型不一致!")
else:
self.translation.setText("暂不支持读取此类型文件!")
# 保存各种文件
def save_file(self):
fileName1, fileType1 = QFileDialog.getSaveFileName(self, "保存文件", "./","保存的文件类型(*.txt);;保存的文件类型(*.docx);;保存的文件类型(*.pdf)")
if fileName1:
flag1 = os.path.splitext(fileName1)[1]
if flag1 == '.txt':
f5 = open(str(fileName1), "a+", encoding='UTF-8')
f5.write(self.translation.toPlainText() + '\n' + self.translationresult.toPlainText())
f5.close()
elif flag1 == '.docx':
docx1 = docx.Document()
docx1.add_paragraph(self.translation.toPlainText() + '\n' + self.translationresult.toPlainText())#增加一个paragraph
docx1.save(fileName1)
elif flag1 == '.pdf':
if os.path.exists(fileName1):
os.remove(fileName1)
docx2 = docx.Document()
docx2.add_paragraph(self.translation.toPlainText() + '\n' + self.translationresult.toPlainText())
zhuanhua2 = os.path.splitext(fileName1)[0] + str(random.randint(1, 248)) + '.docx'
docx2.save(zhuanhua2)
wordsss = client.DispatchEx("Word.Application")#将生成的docx文件转化为pdf文件
worddoc = wordsss.Documents.Open(zhuanhua2, ReadOnly=1)
worddoc.SaveAs(fileName1, FileFormat=17)
worddoc.Close()
os.remove(zhuanhua2)
else:
self.translation.setText("暂不支持保存此类型文件!")
# 读取软件说明
def about_(self):
self.translation.setText('')
f6 = QFile('./说明.txt')
f7 = open('./说明.txt', "r", encoding='UTF-8')
data1 = f7.read()
self.translation.setText(data1)
f7.close()
def fanyi(self):
start = time.time()#记录开始翻译时的时间
global imgdict
global imgpath
if self.select.currentText() == '图片翻译':
if imgdict[imgpath] != 0:
self.translation.setText('')
appId, apiKey, secretKey = ['24934744', '2X0jHwt9xQTPdDSK98UDSmuK', 'PEGjDcvsg9hmZrWyvI7oTrerHmB4lCeg']#此处填入在百度云控制台处获得的appId, apiKey, secretKey的实际值
ocr = AipOcr(appId, apiKey, secretKey)#创建ocr对象
imgs_ = open(imgdict[imgpath], 'rb')
imgs_word = imgs_.read()
res = ocr.basicGeneral(imgs_word)
imgdict[imgpath] = 0
for j in range(len(res['words_result'])):#输出识别图片后的内容
self.translation.append(res['words_result'][j]['words'])
else:
self.translation.setText("检测到没有导入图片,请导入图片后再进行翻译!")
content = self.translation.toPlainText()
if content != '' and content != "检测到没有导入图片,请导入图片后再进行翻译!" and content != "输入的相应内容为空,请输入翻译内容!":
if len(content) > 5000:
self.translation.setText("")
self.translation.setText("翻译内容超过5000字请减少翻译内容")
elif self.select_.currentText() == '有道翻译':#实现爬取有道翻译
self.translationresult.setText("")
languagedict = {
'自动检测语言(有道翻译)': ['AUTO', 'AUTO'],
'中文-->英语': ['zh-CHS', 'en'],
'英语-->中文': ['en', 'zh-CHS'],
'中文-->日语': ['zh-CHS', 'ja'],
'日语-->中文': ['ja', 'zh-CHS'],
'中文-->韩语': ['zh-CHS', 'ko'],
'韩语-->中文': ['ko', 'zh-CHS'],
'中文-->法语': ['zh-CHS', 'fr'],
'法语-->中文': ['fr', 'zh-CHS'],
'中文-->德语': ['zh-CHS', 'de'],
'德语-->中文': ['de', 'zh-CHS'],
'中文-->俄语': ['zh-CHS', 'ru'],
'俄语-->中文': ['ru', 'zh-CHS'],
'中文-->西班牙语': ['zh-CHS', 'es'],
'西班牙语-->中文': ['es', 'zh-CHS'],
'中文-->葡萄牙语': ['zh-CHS', 'pt'],
'葡萄牙语-->中文': ['pt', 'zh-CHS'],
'中文-->意大利语': ['zh-CHS', 'it'],
'意大利语-->中文': ['it', 'zh-CHS'],
'中文-->越南语': ['zh-CHS', 'vi'],
'越南语-->中文': ['vi', 'zh-CHS'],
'中文-->印尼语': ['zh-CHS', 'id'],
'印尼语-->中文': ['id', 'zh-CHS'],
'中文-->阿拉伯语': ['zh-CHS', 'ar'],
'阿拉伯语-->中文': ['ar', 'zh-CHS'],
'中文-->荷兰语': ['zh-CHS', 'nl'],
'荷兰语-->中文': ['nl', 'zh-CHS'],
'中文-->泰语': ['zh-CHS', 'th'],
'泰语-->中文': ['th', 'zh-CHS']
}
language = self.language.currentText()#获得当前内容
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
ua = Faker().user_agent()
headers = {
'User-Agent': ua,
'Host': 'fanyi.youdao.com',
'Origin': 'http://fanyi.youdao.com',
'Referer': 'http://fanyi.youdao.com/',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=685199569@10.108.160.102; JSESSIONID=aaaxE_dUg26X_bLyaCxWx; ___rl__test__cookies=' + str(time.time() * 1000) + '; OUTFOX_SEARCH_USER_ID_NCOO=836327382.8014793'
}
ts = str(time.time() * 1000)#生成相关的三个参数
salt = ts + str(random.randint(0, 10))
the_str = "fanyideskweb" + content + salt + "Y2FYu%TNSbMCxc3t2u^XT"
md5 = hashlib.md5()
md5.update(the_str.encode('utf-8'))
sign = md5.hexdigest()
data = {
'i': content,
'from': languagedict[language][0],
'to': languagedict[language][1],
'smartresult': "dict",
'client': "fanyideskweb",
'salt': salt,
'sign': sign,
'lts': ts,
'bv': "e2a78ed30c66e16a857c5b6486a1d326",
'doctype': "json",
'version': "2.1",
'keyfrom': "fanyi.web",
'action': "FY_BY_REALTlME",
}
response = requests.post(url, headers=headers, data=data).json()
if 'smartResult' in response.keys():#单词的翻译
for i in range(len(response['smartResult']['entries']) - 1):
self.printf(str(i + 1))
self.printf(response['smartResult']['entries'][i + 1])
self.printf("")
end1 = time.time()
self.printf("此次翻译所花费的时间为:" + str(int(end1 - start)) + "s")
else:
for j in range(len(response['translateResult'])):#句子、段落的翻译
result = ''
for k in range(len(response['translateResult'][j])):
result += response['translateResult'][j][k]['tgt']
self.printf(result)
self.printf("")
end2 = time.time()#记录翻译结束的时间
self.printf("此次翻译所花费的时间为:" + str(int(end2 - start)) + "s")
elif self.select_.currentText() == '百度翻译':#实现破解百度翻译
self.translationresult.setText("")
if len(content) < 10 and (self.language_.currentText() == '中文-->英语(百度翻译)' or self.language_.currentText() == '英语-->中文'):
url2 = "https://fanyi.baidu.com/sug"
data1 = {'kw': content}
response2 = requests.post(url2, data=data1).json()
for a in range(len(response2['data'])):#单词翻译
self.printf(str(a + 1))
self.printf(response2['data'][a]['v'] + response2['data'][a]['k'])
self.printf("")
end3 = time.time()
self.printf("此次翻译所花费的时间为:" + str(int(end3 - start)) + "s")
else:
languagedict_ = {
'中文-->英语(百度翻译)': ['zh', 'en'],
'英语-->中文': ['en', 'zh'],
'中文-->粤语': ['zh', 'yue'],
'粤语-->中文': ['yue', 'zh'],
'中文-->文言文': ['zh', 'wyw'],
'文言文-->中文': ['wyw', 'zh'],
'中文-->中文繁体': ['zh', 'cht'],
'中文繁体-->中文': ['cht', 'zh'],
'中文-->韩语': ['zh', 'kor'],
'中文-->法语': ['zh', 'fra'],
'中文-->德语': ['zh', 'de'],
'中文-->俄语': ['zh', 'ru'],
'中文-->西班牙语': ['zh', 'spa'],
'中文-->葡萄牙语': ['zh', 'pt'],
'中文-->意大利语': ['zh', 'it'],
'中文-->越南语': ['zh', 'vie'],
'中文-->印尼语': ['zh', 'id'],
'中文-->阿拉伯语': ['zh', 'ara'],
'中文-->荷兰语': ['zh', 'nl'],
'中文-->泰语': ['zh', 'th'],
'中文-->日语': ['zh', 'jp'],
'日语-->中文': ['jp', 'zh'],
'韩语-->中文': ['kor', 'zh'],
'法语-->中文': ['fra', 'zh'],
'德语-->中文': ['de', 'zh'],
'俄语-->中文': ['ru', 'zh'],
'西班牙语-->中文': ['spa', 'zh'],
'葡萄牙语-->中文': ['pt', 'zh'],
'意大利语-->中文': ['it', 'zh'],
'越南语-->中文': ['vie', 'zh'],
'印尼语-->中文': ['id', 'zh'],
'阿拉伯语-->中文': ['ara', 'zh'],
'荷兰语-->中文': ['nl', 'zh'],
'泰语-->中文': ['th', 'zh']
}
js = open("sign.js", "r")#生成相关的一个参数
run_js = execjs.compile(js.read())
sign = run_js.call("e", content)#e为函数名
js.close()
headers1 = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0",
"Cookie": "BAIDUID=1142AB91A9B514C11E73BD742DC5FE5C:FG=1; BIDUPSID=1142AB91A9B514C1B99F81A532D2E655; PSTM=1634650823; BDRCVFR[gltLrB7qNCt]=mk3SLVN4HKm; delPer=0; PSINO=7; H_PS_PSSID=34444_34067_34712_34584_34517_34832_26350_34828_34868_34473_34672; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1634650973,1634651117; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1634651117; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; __yjs_duid=1_11c84809e4b85738cf11c598a4671c281634650972004"
}
data2 = {
'from': languagedict_[self.language_.currentText()][0],
'to': languagedict_[self.language_.currentText()][1],
'query': content,
'transtype': 'translang',
'simple_means_flag': '3',
'sign': sign,
'token': 'd8ef57d577cfbac850d72d3d6dde0dfb',
'domain': 'common',
}
url1 = "https://fanyi.baidu.com/v2transapi?from={}&to={}".format(languagedict_[self.language_.currentText()][0], languagedict_[self.language_.currentText()][1])
response1 = requests.post(url1, headers=headers1, data=data2).json()
for b in range(len(response1["trans_result"]['data'])):#句子、段落翻译
self.printf(response1["trans_result"]['data'][b]['dst'])
self.printf("")
end4 = time.time()
self.printf("此次翻译所花费的时间为:" + str(int(end4 - start)) + "s")
else:
self.translation.setText("")
self.translation.setText("输入的相应内容为空,请输入翻译内容!")
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "爬虫翻译"))
self.select_.setItemText(0, _translate("MainWindow", "有道翻译"))
self.select_.setItemText(1, _translate("MainWindow", "百度翻译"))
self.select.setItemText(0, _translate("MainWindow", "文字翻译"))
self.select.setItemText(1, _translate("MainWindow", "图片翻译"))
self.language.setItemText(0, _translate("MainWindow", "自动检测语言(有道翻译)"))
self.language.setItemText(1, _translate("MainWindow", "中文-->英语"))
self.language.setItemText(2, _translate("MainWindow", "英语-->中文"))
self.language.setItemText(3, _translate("MainWindow", "中文-->韩语"))
self.language.setItemText(4, _translate("MainWindow", "中文-->法语"))
self.language.setItemText(5, _translate("MainWindow", "中文-->德语"))
self.language.setItemText(6, _translate("MainWindow", "中文-->俄语"))
self.language.setItemText(7, _translate("MainWindow", "中文-->西班牙语"))
self.language.setItemText(8, _translate("MainWindow", "中文-->葡萄牙语"))
self.language.setItemText(9, _translate("MainWindow", "中文-->意大利语"))
self.language.setItemText(10, _translate("MainWindow", "中文-->越南语"))
self.language.setItemText(11, _translate("MainWindow", "中文-->印尼语"))
self.language.setItemText(12, _translate("MainWindow", "中文-->阿拉伯语"))
self.language.setItemText(13, _translate("MainWindow", "中文-->荷兰语"))
self.language.setItemText(14, _translate("MainWindow", "中文-->泰语"))
self.language.setItemText(15, _translate("MainWindow", "中文-->日语"))
self.language.setItemText(16, _translate("MainWindow", "日语-->中文"))
self.language.setItemText(17, _translate("MainWindow", "韩语-->中文"))
self.language.setItemText(18, _translate("MainWindow", "法语-->中文"))
self.language.setItemText(19, _translate("MainWindow", "德语-->中文"))
self.language.setItemText(20, _translate("MainWindow", "俄语-->中文"))
self.language.setItemText(21, _translate("MainWindow", "西班牙语-->中文"))
self.language.setItemText(22, _translate("MainWindow", "葡萄牙语-->中文"))
self.language.setItemText(23, _translate("MainWindow", "意大利语-->中文"))
self.language.setItemText(24, _translate("MainWindow", "越南语-->中文"))
self.language.setItemText(25, _translate("MainWindow", "印尼语-->中文"))
self.language.setItemText(26, _translate("MainWindow", "阿拉伯语-->中文"))
self.language.setItemText(27, _translate("MainWindow", "荷兰语-->中文"))
self.language.setItemText(28, _translate("MainWindow", "泰语-->中文"))
self.language_.setItemText(0, _translate("MainWindow", "中文-->英语(百度翻译)"))
self.language_.setItemText(1, _translate("MainWindow", "英语-->中文"))
self.language_.setItemText(2, _translate("MainWindow", "中文-->粤语"))
self.language_.setItemText(3, _translate("MainWindow", "粤语-->中文"))
self.language_.setItemText(4, _translate("MainWindow", "中文-->文言文"))
self.language_.setItemText(5, _translate("MainWindow", "文言文-->中文"))
self.language_.setItemText(6, _translate("MainWindow", "中文-->中文繁体"))
self.language_.setItemText(7, _translate("MainWindow", "中文繁体-->中文"))
self.language_.setItemText(8, _translate("MainWindow", "中文-->韩语"))
self.language_.setItemText(9, _translate("MainWindow", "中文-->法语"))
self.language_.setItemText(10, _translate("MainWindow", "中文-->德语"))
self.language_.setItemText(11, _translate("MainWindow", "中文-->俄语"))
self.language_.setItemText(12, _translate("MainWindow", "中文-->西班牙语"))
self.language_.setItemText(13, _translate("MainWindow", "中文-->葡萄牙语"))
self.language_.setItemText(14, _translate("MainWindow", "中文-->意大利语"))
self.language_.setItemText(15, _translate("MainWindow", "中文-->越南语"))
self.language_.setItemText(16, _translate("MainWindow", "中文-->印尼语"))
self.language_.setItemText(17, _translate("MainWindow", "中文-->阿拉伯语"))
self.language_.setItemText(18, _translate("MainWindow", "中文-->荷兰语"))
self.language_.setItemText(19, _translate("MainWindow", "中文-->泰语"))
self.language_.setItemText(20, _translate("MainWindow", "中文-->日语"))
self.language_.setItemText(21, _translate("MainWindow", "日语-->中文"))
self.language_.setItemText(22, _translate("MainWindow", "韩语-->中文"))
self.language_.setItemText(23, _translate("MainWindow", "法语-->中文"))
self.language_.setItemText(24, _translate("MainWindow", "德语-->中文"))
self.language_.setItemText(25, _translate("MainWindow", "俄语-->中文"))
self.language_.setItemText(26, _translate("MainWindow", "西班牙语-->中文"))
self.language_.setItemText(27, _translate("MainWindow", "葡萄牙语-->中文"))
self.language_.setItemText(28, _translate("MainWindow", "意大利语-->中文"))
self.language_.setItemText(29, _translate("MainWindow", "越南语-->中文"))
self.language_.setItemText(30, _translate("MainWindow", "印尼语-->中文"))
self.language_.setItemText(31, _translate("MainWindow", "阿拉伯语-->中文"))
self.language_.setItemText(32, _translate("MainWindow", "荷兰语-->中文"))
self.language_.setItemText(33, _translate("MainWindow", "泰语-->中文"))
self.translation.setPlaceholderText(_translate("MainWindow", "请输入翻译内容:"))
self.translationresult.setPlaceholderText(_translate("MainWindow", "翻译结果:"))
self.translate.setText(_translate("MainWindow", "翻译"))
self.clear.setText(_translate("MainWindow", "清空"))
self.copy.setText(_translate("MainWindow", "复制"))
self.paste.setText(_translate("MainWindow", "粘贴"))
self.signup.setText(_translate("MainWindow", "退出"))
self.menu.setTitle(_translate("MainWindow", "文件"))
self.a_open_file.setText(_translate("MainWindow", "读取文件"))
self.a_save_file.setText(_translate("MainWindow", "保存文件"))
self.a_about_.setText(_translate("MainWindow", "关于软件"))
class Window(QMainWindow,Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
def keyPressEvent(self, event):
if (event.key() == Qt.Key_T or event.key() == Qt.Key_Enter):#这里event.key显示的是按键的编码按键事件对大小写不敏感
self.fanyi()
if (event.key() == Qt.Key_C):
self.copy_()
if (event.key() == Qt.Key_P):
self.translation.paste()
if (event.key() == Qt.Key_Q):
self.translation.clear()
self.translationresult.clear()
if (event.key() == Qt.Key_Escape):
self.close()
if (event.key() == Qt.Key_R):
self.open_file()
if (event.key() == Qt.Key_S):
self.save_file()
# 当需要组合键时要很多种方式这里举例为“shift+单个按键”也可以采用shortcut、或者pressSequence的方法。
# if (event.key() == Qt.Key_P):
# if QApplication.keyboardModifiers() == Qt.ShiftModifier:
# print("shift + p")
# else :
# print("p")
#
# if (event.key() == Qt.Key_O) and QApplication.keyboardModifiers() == Qt.ShiftModifier:
# print("shift + o")
# # 响应鼠标事件
# def mousePressEvent(self, event):
# if event.button() == Qt.LeftButton:
# print("鼠标左键点击")
# elif event.button() == Qt.RightButton:
# print("鼠标右键点击")
# elif event.button() == Qt.MidButton:
# print("鼠标中键点击")
class Ui_widget(object):
def setupUi(self, widget):
widget.setObjectName("widget")
widget.resize(80, 80)
self.pushButton = QtWidgets.QPushButton(widget)
self.pushButton.setGeometry(QtCore.QRect(10, 10, 60, 60))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(widget)
self.pushButton.clicked.connect(self.xs)
QtCore.QMetaObject.connectSlotsByName(widget)
self.setWindowFlags(self.windowFlags() | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)#设置窗体去掉按钮、去边框、置顶
self.setAttribute(Qt.WA_TranslucentBackground)#设置窗体透明
self.pushButton.setStyleSheet("QPushButton{border-image:url(./xfc.jpg);color:white;border-radius:5px;}QPushButton:hover{border-image:url(./xfc1.jpg);color:gray;}")#设置控件的复合事件
self.pushButton.setCursor(QCursor(Qt.PointingHandCursor))#设置鼠标形状
#显示主界面
def xs(self):
global flag
if flag%2 == 0:
window.close()
else:
screen = QDesktopWidget().screenGeometry()# 获取屏幕坐标系
size = window.geometry() # 获取窗口坐标系
newLeft = (screen.width() - size.width()) / 2 # 计算
newTop = (screen.height() - size.height()) / 2
window.move(int(newLeft), int(newTop) - 42)
window.show()
flag+=1
def retranslateUi(self, widget):
_translate = QtCore.QCoreApplication.translate
widget.setWindowTitle(_translate("widget", "悬浮窗"))
self.pushButton.setText(_translate("widget", ""))
class Windows(QWidget, Ui_widget):
def __init__(self):
super().__init__()
self._startPos = None
self._endPos = None
self._tracking = False
self.setupUi(self)
#重写键盘事件
def keyPressEvent(self, event):
if (event.key() == Qt.Key_Escape):#这里event.key显示的是按键的编码按键事件对大小写不敏感
self.close()
window.close()
# 重写移动事件
def mouseMoveEvent(self, e: QMouseEvent):
if self._tracking:
self._endPos = e.pos() - self._startPos
self.move(self.pos() + self._endPos)
def mousePressEvent(self, e: QMouseEvent):
if e.button() == Qt.RightButton:
self._startPos = QPoint(e.x(), e.y())
self._tracking = True
def mouseReleaseEvent(self, e: QMouseEvent):
if e.button() == Qt.RightButton:
self._tracking = False
self._startPos = None
self._endPos = None
#显示悬浮窗
def enterEvent(self, a0):
screen1 = QDesktopWidget().screenGeometry()
w1 = windows.geometry()
if w1.x() == -52:#左侧
self.startAnimation(54,0)
elif w1.y() == -52:#上方
self.startAnimation(0, 54)
elif w1.x() == screen1.width()-84+62:#右侧
self.startAnimation(-54, 0)
elif w1.y() == screen1.height()-84+62:#下方
self.startAnimation(0, -54)
# return super().enterEvent(a0)
#隐藏悬浮窗
def leaveEvent(self,a1):
screen = QDesktopWidget().screenGeometry()
w = windows.geometry()
if w.x() < 10 :#左侧
windows.move(10, w.y())
self.startAnimation(-62, 0)
elif w.y() < 10:#上方
windows.move(w.x(), 10)
self.startAnimation(0, -62)
elif screen.width() - w.x() < 84:#右侧
windows.move(screen.width()-84, w.y())
self.startAnimation(62, 0)
elif screen.height() - w.y() < 84:#下方
windows.move(w.x(), screen.height()-84)
self.startAnimation(0, 62)
def startAnimation(self,x,y):
animation = QPropertyAnimation(windows, b"geometry",self)
startpos = windows.geometry()
newpos = QRect(startpos.x() + x, startpos.y() + y, startpos.width(), startpos.height())
animation.setEndValue(newpos)
animation.setDuration(1000)
animation.start()
if __name__ == '__main__':
imgpath = 'imgflag'
imgdict = {imgpath: 0}
readflag = 0
flag = 1
app = QApplication(sys.argv)
windows = Windows()
window = Window()
windows.show()
sys.exit(app.exec_())