def Login_success(self): try: self.Settin = SettinInterface(self.screen_scale_rate) # 设置界面 self.Init = MainInterface(self.screen_scale_rate, self.user) # 翻译界面 self.chooseRange = Range(self.data["range"]['X1'], self.data["range"]['Y1'], self.data["range"]['X2'], self.data["range"]['Y2']) if pyhk is not None: self.set_hotKey() # 设置快捷键 # 监听快捷键事件加入子线程 self.thread_hotKey = Thread(target=self.hotKey.start) self.thread_hotKey.setDaemon(True) self.thread_hotKey.start() else: # 在mac/ubuntu上用qt自己的热键, 但是不支持全局热键 self.Init.keyPressEvent = self.keyPressEvent # 点击设置键后执行的函数 self.Init.SettinButton.clicked.connect(self.goto_settin) # 点击语言提示按钮 self.Init.languageText.clicked.connect(self.goto_settin) # 点击范围键后执行的函数 self.Init.RangeButton.clicked.connect(self.goto_range) # 点击退出键后执行的函数 self.Init.QuitButton.clicked.connect(self.close) # 点击设置页面的保存键后执行的函数 self.Settin.SaveButton.clicked.connect(self.updata_Init) # 点击设置页面的退出键后执行的函数 self.Settin.CancelButton.clicked.connect(self.Settin.close) except Exception: write_error(format_exc())
def updata_Init(self): try: if self.Init.mode == False: self.Init.start_login() except Exception: write_error(format_exc())
def lock(self): try: if self.lock_sign == 0: self.LockButton.setIcon(qticon('fa.unlock', color='white')) self.dragLabel.hide() self.lock_sign = 1 if self.horizontal == 0.01: self.horizontal = 0 else: self.LockButton.setIcon(qticon('fa.lock', color='white')) self.LockButton.setStyleSheet( "background-color:rgba(62, 62, 62, 0);") self.dragLabel.show() self.lock_sign = 0 if self.horizontal == 0: self.horizontal = 0.01 self.translateText.setStyleSheet("border-width:0;\ border-style:outset;\ border-top:0px solid #e8f3f9;\ color:white;\ font-weight: bold;\ background-color:rgba(62, 62, 62, %s)" % (self.horizontal)) except Exception: write_error(format_exc())
def save_voice(self, language=None): try: if language is None: with open(folder_path + '/config/settin.json') as file: data = load(file) language = data["language"] language = config.voice_language[language] content = parse.quote(self.text) tk = self.getTk() url = "https://translate.google.cn/translate_tts?ie=UTF-8&q=" + content + "&tl=" + language + "&total=1&idx=0&textlen=107&tk=" + tk + "&client=webapp&prev=input" res = self.session.get(url, headers=self.headers) save_path = folder_path + '/config/voice.mp3' if os.path.isfile(save_path): os.remove(save_path) with open(save_path, 'wb') as file: file.write(res.content) # 没有gi解决办法(https://blog.csdn.net/xxxlinttp/article/details/78056467): # 复制一份/home/ming/miniconda3/envs/python36/lib/python3.6/site-packages/gi到自己的虚拟环境 # playsound(folder_path + '/config/voice.mp3') return True, save_path except Exception: write_error(format_exc()) return False, ''
def mouseMoveEvent(self, e: QMouseEvent): try: if self._startPos is not None: self._endPos = e.pos() - self._startPos self.move(self.pos() + self._endPos) except Exception: write_error(format_exc())
def mousePressEvent(self, e: QMouseEvent): try: if e.button() == Qt.LeftButton: self._isTracking = True self._startPos = QPoint(e.x(), e.y()) except Exception: write_error(format_exc())
def enterEvent(self, QEvent): if self.lock_sign == 1: self.LockButton.show() self.LockButton.setStyleSheet( "background-color:rgba(62, 62, 62, 0.7);") return try: # 显示所有顶部工具栏控件 self.switchBtn.show() self.StartButton.show() self.SettinButton.show() self.RangeButton.show() self.OpenButton.show() self.CopyButton.show() self.QuitButton.show() self.MinimizeButton.show() self.playVoiceButton.show() self.LockButton.show() self.languageText.show() self.setStyleSheet( 'QLabel#dragLabel {background-color:rgba(62, 62, 62, 0.3)}') except Exception: write_error(format_exc())
def leaveEvent(self, QEvent): try: # 重置所有控件的位置和大小 width = (self.width() * 213) / 800 height = self.height() - 30 self.RangeButton.setGeometry( QRect(width - 20 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.StartButton.setGeometry( QRect(width + 20 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.OpenButton.setGeometry( QRect(width + 60 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.CopyButton.setGeometry( QRect(width + 100 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.playVoiceButton.setGeometry( QRect(width + 140 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.switchBtn.setGeometry( QRect(width + 180 * self.rate, 5 * self.rate, 50 * self.rate, 20 * self.rate)) self.languageText.setGeometry(width + 250 * self.rate, 5 * self.rate, 45 * self.rate, 20 * self.rate) self.SettinButton.setGeometry( QRect(width + 305 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.LockButton.setGeometry( QRect(width + 345 * self.rate, 5 * self.rate, 24 * self.rate, 20 * self.rate)) self.MinimizeButton.setGeometry( QRect(width + 389 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.QuitButton.setGeometry( QRect(width + 429 * self.rate, 5 * self.rate, 20 * self.rate, 20 * self.rate)) self.translateText.setGeometry(0, 30 * self.rate, self.width(), height * self.rate) # 隐藏所有顶部工具栏控件 self.switchBtn.hide() self.StartButton.hide() self.SettinButton.hide() self.RangeButton.hide() self.OpenButton.hide() self.CopyButton.hide() self.QuitButton.hide() self.MinimizeButton.hide() self.playVoiceButton.hide() self.LockButton.hide() self.languageText.hide() self.setStyleSheet('QLabel#dragLabel {background-color:none}') except Exception: write_error(format_exc())
def save_text(self): try: time_array = localtime(int(time())) str_date = strftime("DangoOCR_%Y-%m-%d_%H-%M-%S", time_array) default_name = self.default_save_path[0] + "/" + str_date save_p, extend = QFileDialog.getSaveFileName( self, 'save file', default_name, "txt (*.txt);;docx (*.docx)") if '.txt' in extend: if save_p[-4:] != '.txt': save_p += '.txt' imwrite(save_p[:-4] + ".jpg", self.np_img) with open(save_p, 'w', encoding='utf-8') as f: for vis_text in self.vis_text_result: f.write(vis_text.toPlainText() + "\n") elif '.docx' in extend: if save_p[-5:] != '.docx': save_p += '.docx' imwrite(save_p[:-5] + ".jpg", self.np_img) document = Document() for vis_text in self.vis_text_result: document.add_paragraph(vis_text.toPlainText()) document.save(save_p) if save_p != '': self.default_save_path[0] = dirname(save_p) except Exception: write_error(format_exc())
def mouseReleaseEvent(self, e: QMouseEvent): try: if e.button() == Qt.LeftButton: self._isTracking = False self._startPos = None self._endPos = None except Exception: write_error(format_exc())
def mouseMoveEvent(self, event): try: if self.isDrawing: self.endPoint = event.pos() self.update() except Exception: write_error(format_exc())
def mousePressEvent(self, event): try: if event.button() == Qt.LeftButton: self.startPoint = event.pos() self.endPoint = self.startPoint self.isDrawing = True except Exception: write_error(format_exc())
def mouseMoveEvent(self, e: QMouseEvent): if self.lock_sign == 1: return try: self._endPos = e.pos() - self._startPos self.move(self.pos() + self._endPos) except Exception: write_error(format_exc())
def mouseReleaseEvent(self, event): try: if event.button() == Qt.LeftButton: self.endPoint = event.pos() self.getRange() self.close() self.updata_Init() except Exception: write_error(format_exc())
def enterEvent(self, QEvent): try: rect = self.geometry() X1 = rect.left() Y1 = rect.top() X2 = rect.left() + rect.width() Y2 = rect.top() + rect.height() self.Button.setGeometry(QRect(X2 - X1 - 40, 0, 40, 30)) self.Button.show() self.dragLabel.setStyleSheet( "background-color:rgba(62, 62, 62, 0.3)") except Exception: write_error(format_exc())
def paintEvent(self, event): try: if self.isDrawing: self.mask = self.blackMask.copy() pp = QPainter(self.mask) pen = QPen() pen.setStyle(Qt.NoPen) pp.setPen(pen) brush = QBrush(Qt.white) pp.setBrush(brush) pp.drawRect(QRect(self.startPoint, self.endPoint)) self.setMask(QBitmap(self.mask)) except Exception: write_error(format_exc())
def set_hotKey(self): try: self.hotKey = pyhk() self.id_translate = False # 翻译快捷键预设 self.id_range = False # 范围快捷键预设 # 是否启用翻译键快捷键 if self.data["showHotKey1"] == "True": self.id_translate = self.hotKey.addHotkey( [self.data["showHotKeyValue1"]], self.Init.start_login) # 是否截图键快捷键 if self.data["showHotKey2"] == "True": self.id_range = self.hotKey.addHotkey( [self.data["showHotKeyValue2"]], self.goto_range) except Exception: write_error(format_exc())
def __init__(self, X1, Y1, X2, Y2): try: super(Range, self).__init__() self.setGeometry(X1, Y1, X2 - X1, Y2 - Y1) # 窗口无标题栏、窗口置顶、窗口透明 self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool) self.setAttribute(Qt.WA_TranslucentBackground) self.Label = QLabel(self) self.Label.setObjectName("dragLabel") self.Label.setGeometry(0, 0, X2 - X1, Y2 - Y1) self.Label.setStyleSheet("border-width:1;\ border:2px dashed #1E90FF;\ background-color:rgba(62, 62, 62, 0.01)") # 此Label用于当鼠标进入界面时给出颜色反应 self.dragLabel = QLabel(self) self.dragLabel.setObjectName("dragLabel") self.dragLabel.setGeometry(0, 0, 4000, 2000) self.Font = QFont() self.Font.setFamily("华康方圆体W7") self.Font.setPointSize(12) # 隐藏按钮 self.Button = QPushButton(self) self.Button.setGeometry(QRect(X2 - X1 - 40, 0, 40, 30)) self.Button.setStyleSheet("background-color:rgba(62, 62, 62, 0.3);" "color:#1E90FF") self.Button.setFont(self.Font) self.Button.setText("隐藏") self.Button.setCursor(QCursor(Qt.PointingHandCursor)) self.Button.clicked.connect(self.close) self.Button.hide() # 右下角用于拉伸界面的控件 self.statusbar = QStatusBar(self) self.setStatusBar(self.statusbar) self._startPos = None except Exception: write_error(format_exc())
def play_voice(self): if not self.original: return try: # thread = Thread(target=Voice, args=(self.original,)) # thread.setDaemon(True) # thread.start() self.player = None flag, voice_file = Voice(self.original).save_voice() if flag: file = QUrl.fromLocalFile(voice_file) content = QMediaContent(file) self.player = QMediaPlayer() self.player.setMedia(content) self.player.play() except Exception: write_error(format_exc())
def display_text(self, result, data, translate_type): try: if data["showColorType"] == "False": self.format.setTextOutline( QPen(QColor(data["fontColor"][translate_type]), 0.7, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin)) self.translateText.mergeCurrentCharFormat(self.format) self.translateText.append(result) else: self.translateText.append( "<font color=%s>%s</font>" % (data["fontColor"][translate_type], result)) # 保存译文 self.save_text(result, translate_type) self.thread_state -= 1 # 线程结束,减少线程数 except Exception: write_error(format_exc())
def main(self): try: self.screen_scale_rate = get_screen_rate() self.open_settin() self.data["sign"] = 1 # 重置运行状态标志符 self.save_settin() App = QApplication(sys.argv) self.user = "******" self.Login_success() self.Init.show() App.exit(App.exec_()) except Exception: write_error(format_exc())
def goto_range(self): try: self.Range = WScreenShot(self.Init, self.chooseRange) # 范围界面 # 判断当前翻译运行状态,若为开始则切换为停止 if self.Init.mode == True: self.open_settin() self.data["sign"] = 1 # 重置运行状态标志符 self.save_settin() # 改变翻译键的图标为停止图标 self.Init.StartButton.setIcon(qticon('fa.play', color='white')) self.Range.show() # 打开范围界面 self.Init.show() # 翻译界面会被顶掉,再次打开 if pyhk is not None and not self.thread_hotKey.isAlive(): self.thread_hotKey.start() except Exception: write_error(format_exc())
def image_cut(data): x1 = data["range"]['X1'] + 2 # 不截虚线框 y1 = data["range"]['Y1'] + 2 x2 = data["range"]['X2'] - 2 y2 = data["range"]['Y2'] - 2 image = None try: screen = QApplication.primaryScreen() pix = screen.grabWindow(QApplication.desktop().winId(), x1, y1, x2 - x1, y2 - y1) # pix.save(folder_path + '/config/image.jpg') image = pixmap_to_array(pix) # if config.debug: # save_img = folder_path + '/config/image.jpg' # print("保存截图: {}".format(save_img)) # imwrite(save_img, image) except Exception: write_error(format_exc()) return image
def leaveEvent(self, QEvent): try: self.dragLabel.setStyleSheet("background-color:none") self.Label.setGeometry(0, 0, self.width(), self.height()) self.Button.hide() rect = self.geometry() X1 = rect.left() Y1 = rect.top() X2 = rect.left() + rect.width() Y2 = rect.top() + rect.height() set_path = folder_path + '/config/settin.json' with open(set_path) as file: data = load(file) data["range"]["X1"] = X1 data["range"]["Y1"] = Y1 data["range"]["X2"] = X2 data["range"]["Y2"] = Y2 with open(set_path, 'w') as file: dump(data, file, indent=2) except Exception: write_error(format_exc())
def run(self): with open(folder_path + '/config/settin.json') as file: data = load(file) if not self.mode: try: if self.window.thread_state == 0: translate(self.window, data, self.use_translate_signal) except Exception: write_error(format_exc()) else: data["sign"] += 1 with open(folder_path + '/config/settin.json', 'w') as file: dump(data, file, indent=2) try: if data["sign"] % 2 == 0: self.window.StartButton.setIcon( qticon('fa.pause', color='white')) while True: s1 = time() with open(folder_path + '/config/settin.json') as file: data = load(file) if data["sign"] % 2 == 0: try: if self.window.thread_state == 0: s2 = time() if s2 - s1 < config.delay_time: sleep_time = config.delay_time - (s2 - s1) if config.debug: print("自动模式 限制帧率, sleep 时间: {}".format( sleep_time)) sleep(sleep_time) translate(self.window, data, self.use_translate_signal) except Exception: write_error(format_exc()) break else: self.window.StartButton.setIcon( qticon('fa.play', color='white')) break except Exception: write_error(format_exc())
# _*_ coding:UTF-8 _*_ try: from pythoncom import PumpMessages from PyHook3 import HookManager from ctypes import windll from _thread import start_new_thread pyhook_flag = True except: from src.api import write_error from configs import Config write_error("[INFO] 系统 {} 无法设置全局快捷键, 使用Qt自己的热键".format(Config().platform)) pyhook_flag = False class pyhook: """Hotkey class extending PyHook3""" def __init__(self): # initiate internal hotkey list self.KeyDownID = [] self.KeyDown = [] # initiate user hotkey list self.UserHKF = [] self.UserHKFUp = [] self.HKFIDDict = {} # create Lookup for event keys and ids # for keyboards self.ID2Key, self.Key2ID = self.createKeyLookup()
try: from win32.lib import win32con from win32.win32api import GetSystemMetrics from win32.win32gui import GetDC from win32.win32print import GetDeviceCaps win32_flag = True except: win32_flag = False screen_scale_rate_ = 1 from src.api import write_error from configs import Config write_error("[INFO] 系统 {} 没有win32, 无法自动获取屏幕缩放比例,设置为: {}".format( Config().platform, screen_scale_rate_)) def get_real_resolution(): """获取真实的分辨率""" hDC = GetDC(0) # 横向分辨率 w = GetDeviceCaps(hDC, win32con.DESKTOPHORZRES) # 纵向分辨率 h = GetDeviceCaps(hDC, win32con.DESKTOPVERTRES) return w, h def get_screen_size(): """获取缩放后的分辨率""" w = GetSystemMetrics(0)