|
|
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_()) |