自動翻譯器2

自動翻譯器的qt部分

接下來我們要實現qt窗口部分,這裏遇到一個很尷尬的事情,qt for python的開發環境要求按照python,但我安裝的是Anaconda,使用Jupyter開發,安完了PySide2,Qt找不到這個模塊,用Jupyter呢,又提示找不到qt.qpa.plugin,打開環境變量查看os.environ,

'QT_QPA_PLATFORM_PLUGIN_PATH': 'C:\\ProgramData\\Anaconda3\\lib\\site-packages\\PySide2\\plugins\\platform'platform竟然少個s,我也是醉了,由於不想在py文件追加環境變量配置,我很機智的把文件夾platforms複製了一份,改名platform,這樣是不好的,但是好用呀。

  1. 追加main.py文件,導入需要的包
import sys
import random
from PySide2.QtWidgets import QApplication, QWidget, QTextEdit, QHBoxLayout
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile, QDir, QTimer, Slot, Qt
from PySide2.QtGui import QClipboard
from Spider import *

  1. 使用線程創建翻譯器
#創建翻譯器
class WorkerThread(QThread):
    resultReady = Signal()
    def __init__(self):
        super().__init__()

    def __del__(self):
        pass

    def run(self):
        global translation
        translation = Translation()
        self.resultReady.emit()
  1. 翻譯過程也使用線程
#翻譯線程
class WorkerThreadTrans(QThread):
    resultReady = Signal(str)
    def __init__(self):
        super().__init__()
        self.last = ''

    def setText(self, value):
        self.value = value

    def run(self):
        self.result = ''
        while(1):
            self.getClipborad()
            time.sleep(1)

    @Slot()
    def getClipborad(self):
        global translation
        board = QApplication.clipboard()
        self.str = board.text()
        if self.str == '' or self.str == self.last:
            pass
        else:
            try:
                self.last = self.str
                self.result = translation.translate(self.str)
            except:
                pass
            finally:
                pass
            self.resultReady.emit(self.result)
  1. 實現窗口類
#窗口
class Form(QWidget):
    def __init__(self):
        super().__init__()
        
        self.textEdit = QTextEdit()
        self.layout = QHBoxLayout()
        self.layout.addWidget(self.textEdit)
        self.setLayout(self.layout)
        
        self.setWindowTitle("百度翻譯器")
        self.resize(400, 300)
        self.setWindowFlags(Qt.WindowStaysOnTopHint)
        self.icon = QIcon()
        self.icon.addPixmap(QPixmap('favicon.ico'), QIcon.Normal, QIcon.Off)
        self.setWindowIcon(self.icon)

        self.create = False

        self.thread = WorkerThread()
        self.thread.finished.connect(self.thread.deleteLater)
        self.thread.resultReady.connect(self.createTrans)
        self.thread.start()

        self.threadTrans = WorkerThreadTrans()
        self.threadTrans.finished.connect(self.threadTrans.deleteLater)
        self.threadTrans.resultReady.connect(self.setTextValue)

        
    def __del__(self):
        self.threadTrans.quit()
        self.threadTrans.wait()
        if self.create:
            del translation
    
    @Slot()
    def createTrans(self):
        self.create = True
        self.threadTrans.start()

    @Slot()
    def setTextValue(self, value):
        self.textEdit.setPlainText(value)
  1. main
if __name__ == "__main__":
    app = QApplication(sys.argv)
    
    translation = None

    window = Form()
    window.show()

    sys.exit(app.exec_())

爲了防止窗口啓動卡頓,運行卡頓,我們開闢了兩個線程。我們還把窗口置頂,爲窗口設置了圖標。我們重載了窗口關閉事件,用於把線程關閉。

  1. 程序運行效果
    1564980342307.png

  2. 打包

具體打包操作請看帖子 https://www.jianshu.com/p/046e690c0f12

打包命令

pyinstaller -F -w -i favicon.ico --icon=favicon.ico main.py -p C:\ProgramData\Anaconda3\Lib\site-packages\PySide2

爲了平臺顯示我們把C:\ProgramData\Anaconda3\Lib\site-packages\PySide2\plugins\platforms\qwindows.dll也拷貝過來
1564993349890.png

  1. 去除selenium隱藏控制檯解決辦法

參考帖子 https://www.cnblogs.com/TurboWay/p/9300105.html

修改C:\ProgramData\Anaconda3\Lib\site-packages\selenium\webdriver\common\service.py源碼

  1. 程序地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章