主頁 > 後端開發 > 自制簡易谷歌翻譯器詳解(附完整UI界面及代碼檔案)

自制簡易谷歌翻譯器詳解(附完整UI界面及代碼檔案)

2022-10-07 07:29:58 後端開發

圖片展示

摘要:Google翻譯大概是目前機器翻譯中翻譯最為準確的了,本文分別使用了兩種可行的方式撰寫了簡易的谷歌翻譯軟體,將詳細介紹呼叫谷歌翻譯API和自行定義谷歌翻譯介面的方式,最后講解如何通過pyqt5實作軟體UI界面并附上全部程式檔案,要點如下:

  • 呼叫Google翻譯API方式
  • 自行定義谷歌翻譯介面方式
  • 谷歌翻譯簡版pyqt5界面設計

點擊跳轉至本文全部檔案下載頁


1. 前言

    目前Google翻譯是我們平時用得比較多的一款軟體,為我們提供了眾多便利,早前谷歌就發布了為用戶提供可呼叫的谷歌翻譯API,對此博主比較欣喜,有了自行DIY一個簡潔版的谷歌翻譯軟體的想法,也為以后用到打點基礎,后來看到網頁版的免費谷歌翻譯,聯想到可以通過類似網路爬蟲的方式自行寫一個谷歌翻譯介面得到網路翻譯的結果,在此將兩種實作方式都寫在這篇博文中,作為總結也希望能給其他想做關于谷歌翻譯研究的朋友有所啟發,


2. 呼叫Google翻譯API方式

    在python中有個googletrans的庫,首先需要通過pip安裝,googletrans可通過在控制臺輸入如下代碼安裝:

pip install googletrans

    通過呼叫googletrans的庫我們可以通過以下的python代碼實作對一段文本的翻譯,首先匯入googletrans庫,第3行實體化一個翻譯物件,其中引數service_urls設定為谷歌翻譯的網址,第5行呼叫translate方法獲得翻譯結果,其中引數source為需要翻譯的文本,src為待翻譯的文本的語言型別(這里設定為中文),dest為翻譯成的文本語言型別(這里設定為英文),獲取翻譯結果中的文本型別作為最終翻譯結果輸出,

# -*- coding: utf-8 -*-
from googletrans import Translator
translator = Translator(service_urls=['translate.google.cn'])
source = '我是博主小思緒,這是我寫的簡易翻譯軟體,真心地希望能夠幫助到您,'
text = translator.translate(source,src='https://www.cnblogs.com/sixuwuxian/archive/2022/10/06/zh-cn',dest='en').text
print(text)
# >I am a blogger with a small thought, this is my simple translation software, I really hope to help you.

運行效果如下:

>I am a blogger with a small thought, this is my simple translation software, I really hope to help you.

    以上代碼中可以看出,googletrans的封裝使得使用起來格外方便,由于是呼叫的谷歌翻譯的API,我們實際的翻譯程序是在線上完成的,因此需要保持網路通暢,同時以上代碼中的方法對于大規模的文本翻譯就比較費時了,


3. 自行定義谷歌翻譯介面方式

    既然上面的庫可以通過訪問網頁的方式獲取翻譯結果,我們當然可以自行撰寫一個類似的介面,思路是通過urllib中的request向谷歌翻譯的網頁發送請求,決議并獲取我們輸入文本的翻譯結果,轉換為我們需要的格式輸出,這其實相當于一個網路爬蟲,其實作的python代碼如下:

# -*- coding: utf-8 -*- 
from re import findall
from urllib.parse import quote_plus
from urllib.request import Request,urlopen
from HTMLParser import HTMLParser

# 偽造成通過瀏覽器訪問,防止被屏蔽
agent = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 LBBROWSER'}

def unescape(text):
    parser = HTMLParser()
    return (parser.unescape(text)) # 轉換成標準的html標簽

def TranslateByGoogle(text, fromLang="auto", toLang="zh-CN"): # 默認輸入語言為自動檢測,翻譯語言為中文
    base_link = "http://translate.google.cn/m?hl=%s&sl=%s&q=%s"# 谷歌翻譯網址
    text = quote_plus(str(text))
    link = base_link % (toLang,fromLang,text) # 實際需要網址
    request = Request(link, headers=agent) # 訪問網頁
    try:
        raw_data = https://www.cnblogs.com/sixuwuxian/archive/2022/10/06/urlopen(request).read() # 讀取網頁資料
        data = raw_data.decode("utf-8") # 對資料解碼,變成Unicode編碼
        expr = r'>(.*?)<'
        re_result = findall(expr, data) # 找到匹配的內容
        if (len(re_result) == 0):
            result = ""
        else:
            result = unescape(re_result[0]) # 轉換翻譯結果為可用形式
        return (result) # 回傳翻譯結果
    except Exception as e:
        print (e)


if __name__=='__main__':
    # 測驗文本
    text='I am a blogger and I sincerely hope that my blog can help you.'
    # 翻譯文本
    translated_text = TranslateByGoogle(text)
    print(translated_text)
    # >我是博主,我真誠地希望我的博客能為您提供幫助,

    在以上代碼中,主要函式是TranslateByGoogle,從下面運行的變數結果截圖可以看出第15-17行是為了得到我們實際需求下實際訪問的網址并訪問,link中包含了訪問的基本網址(谷歌翻譯)、待翻譯語言型別、翻譯語言型別及待翻譯文本,它們以一定規則組成我們需要的最終訪問地址,

變數顯示

    在第20行程式讀取以上網址的網頁資料,獲得的資料還不能直接使用,在21-23行首先將獲得的資料解碼,變成Unicode編碼,以expr為分割點找到包含在expr中的字符作為翻譯結果,當結果不為空時,第27行將結果轉換為我們需要的字串形式,

    如此,自行定義的谷歌翻譯(函式)完成,第33-38行對該函式進行簡單測驗,采用默認引數(fromLang="auto", toLang="zh-CN")將text翻譯能夠得到翻譯的結果(第39行),值得注意的是,在呼叫request訪問網站時通過設定headers引數偽造成瀏覽器瀏覽器訪問,以躲避服務器認為User-Agent為“非人類”而引起的屏蔽,

    在上面的示例中,我們設定輸入文本的語言型別為auto,將識別語言型別的任務交給了谷歌翻譯網頁,而如果我們想自行檢測一段文本的語言型別又該如何實作呢?python的包langid可實作這一功能,首先安裝langid,如下

pip install langid

    通過如下代碼可實作語言型別識別,如輸入s1輸出zh(表示為中文):

from langid import classify
s1 = "我是博主小思緒"
array = classify(s1)
print (array[0])
# > zh

4. 谷歌翻譯簡版pyqt5界面設計

    這里利用pyqt5設計一個UI界面,首先利用Qt Designer將用到的空間拖到主視窗中,其中用到的控制元件有QLabel、QPlainTextEdit、QtoolButtonQTextBrowser,其擺放如下圖所示

圖片展示

    利用PyUIC將保存的UI檔案轉化為py檔案,對生成的界面類稍作修改,標簽5,6分別代表了輸入、輸出語言型別;對兩個QtoolButton控制元件添加回應點擊事件的槽函式,控制元件1用于彈出選擇翻譯方式的對話框,在點擊時跳出輸入框供我們選擇執行翻譯任務的方法,即上面介紹的兩種方法,控制元件2用于交換翻譯的語言型別,被點擊時控制元件5,6上的文本內容交換同時程式實際翻譯時的輸入、輸出語言型別會受到影響(以標簽5,6上的語言型別翻譯),控制元件3、4分別用于顯示輸入文本(待翻譯文本)和輸出文本(翻譯好的文本),實作代碼如下:

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'GoogleTransUI.ui'
# Created by: PyQt5 UI code generator 5.11.3
# author: 思緒無限
# version: 0.1 (2019.5)

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QInputDialog
from PyQt5.QtGui import QIcon
from googleTranslator import TranslateByGoogle
from langid import classify
from googletrans import Translator
import image1_rc # 匯入要用到的圖片檔案

class Ui_MainWindow(object):
    def __init__(self, MainWindow):
        self.type_trans = 'googletrans'

        self.setupUi(MainWindow)
        self.retranslateUi(MainWindow)

        # 設定按鈕點擊監聽事件
        self.toolButton_trans.clicked.connect(self.clickButton_trans)
        self.toolButton_select.clicked.connect(self.clickButton_select)
        # 設定文本被改變監聽事件
        self.textEdit_input.textChanged.connect(self.textChanging_textEdit_input)


    def setupUi(self, MainWindow):
        # 設定主視窗
        MainWindow.setObjectName("MainWindow") # 視窗物件名
        MainWindow.setWindowModality(QtCore.Qt.NonModal)
        MainWindow.resize(600, 500) # 視窗一般大小
        MainWindow.setMinimumSize(QtCore.QSize(600, 500)) # 視窗最小尺寸
        MainWindow.setMaximumSize(QtCore.QSize(16777215, 16777215)) # 視窗最大尺寸
        MainWindow.setToolTip("") # 功能提示
        MainWindow.setAutoFillBackground(False)
        MainWindow.setWindowIcon(QIcon(':/newPrefix/images_test/Google.png')) # 設定視窗圖示
        MainWindow.setIconSize(QtCore.QSize(60, 60)) # 圖示尺寸
        MainWindow.setStyleSheet("...") # 主視窗qss格式,限于篇幅,實際內容貼在博文最后
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout()
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setContentsMargins(-1, -1, -1, 20)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        # 工具按鈕設定
        self.toolButton_trans = QtWidgets.QToolButton(self.centralwidget)
        self.toolButton_trans.setMinimumSize(QtCore.QSize(30, 25))
        self.toolButton_trans.setMaximumSize(QtCore.QSize(20, 20))
        self.toolButton_trans.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.toolButton_trans.setAutoFillBackground(False)
        self.toolButton_trans.setStyleSheet("background-color: transparent;")
        self.toolButton_trans.setText("")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/newPrefix/images_test/exchange.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_trans.setIcon(icon)
        self.toolButton_trans.setIconSize(QtCore.QSize(20, 20))
        self.toolButton_trans.setPopupMode(QtWidgets.QToolButton.DelayedPopup)
        self.toolButton_trans.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
        self.toolButton_trans.setAutoRaise(False)
        self.toolButton_trans.setArrowType(QtCore.Qt.NoArrow)
        self.toolButton_trans.setObjectName("toolButton_trans")
        self.horizontalLayout_3.addWidget(self.toolButton_trans)
        
        self.label_title = QtWidgets.QLabel(self.centralwidget)
        self.label_title.setMinimumSize(QtCore.QSize(0, 30))
        font = QtGui.QFont()
        font.setFamily("隸書")
        font.setPointSize(18)
        self.label_title.setFont(font)
        self.label_title.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop)
        self.label_title.setObjectName("label_title")
        self.horizontalLayout_3.addWidget(self.label_title)
        self.verticalLayout_4.addLayout(self.horizontalLayout_3)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setContentsMargins(-1, 0, -1, 10)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_language1 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("Sitka Small")
        font.setPointSize(13)
        self.label_language1.setFont(font)
        self.label_language1.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_language1.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
        self.label_language1.setObjectName("label_language1")
        self.horizontalLayout.addWidget(self.label_language1)
        self.toolButton_select = QtWidgets.QToolButton(self.centralwidget)
        self.toolButton_select.setMinimumSize(QtCore.QSize(50, 39))
        self.toolButton_select.setMaximumSize(QtCore.QSize(50, 45))
        self.toolButton_select.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.toolButton_select.setAutoFillBackground(False)
        self.toolButton_select.setStyleSheet("background-color: transparent;")
        self.toolButton_select.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap(":/newPrefix/images_test/change.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.toolButton_select.setIcon(icon1)
        self.toolButton_select.setIconSize(QtCore.QSize(50, 39))
        self.toolButton_select.setPopupMode(QtWidgets.QToolButton.DelayedPopup)
        self.toolButton_select.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
        self.toolButton_select.setAutoRaise(False)
        self.toolButton_select.setArrowType(QtCore.Qt.NoArrow)
        self.toolButton_select.setObjectName("toolButton_select")
        self.horizontalLayout.addWidget(self.toolButton_select)
        self.label_language2 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("楷體")
        font.setPointSize(14)
        self.label_language2.setFont(font)
        self.label_language2.setAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
        self.label_language2.setObjectName("label_language2")
        self.horizontalLayout.addWidget(self.label_language2)
        self.verticalLayout_4.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_in = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("微軟雅黑")
        font.setPointSize(10)
        self.label_in.setFont(font)
        self.label_in.setLineWidth(1)
        self.label_in.setObjectName("label_in")
        self.verticalLayout.addWidget(self.label_in)
        self.textEdit_input = QtWidgets.QPlainTextEdit(self.centralwidget)
        self.textEdit_input.setMinimumSize(QtCore.QSize(0, 0))
        self.textEdit_input.setMaximumSize(QtCore.QSize(16777215, 16777215))
        self.textEdit_input.setSizeIncrement(QtCore.QSize(0, 0))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        self.textEdit_input.setFont(font)
        self.textEdit_input.setMouseTracking(True)
        self.textEdit_input.setStyleSheet("background-color: transparent;")
        self.textEdit_input.setLineWidth(3)
        self.textEdit_input.setLineWrapMode(QtWidgets.QPlainTextEdit.WidgetWidth)
        self.textEdit_input.setObjectName("textEdit_input")
        self.verticalLayout.addWidget(self.textEdit_input)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label_out = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setFamily("微軟雅黑")
        font.setPointSize(10)
        self.label_out.setFont(font)
        self.label_out.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
        self.label_out.setObjectName("label_out")
        self.verticalLayout_2.addWidget(self.label_out)
        self.textBrowser_output = QtWidgets.QTextBrowser(self.centralwidget)
        self.textBrowser_output.setMinimumSize(QtCore.QSize(0, 0))
        self.textBrowser_output.setMaximumSize(QtCore.QSize(16777215, 16777215))
        font = QtGui.QFont()
        font.setFamily("Consolas")
        font.setPointSize(9)
        font.setItalic(False)
        self.textBrowser_output.setFont(font)
        self.textBrowser_output.setStyleSheet("background-color: transparent;")
        self.textBrowser_output.setLineWidth(3)
        self.textBrowser_output.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.textBrowser_output.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
        self.textBrowser_output.setLineWrapMode(QtWidgets.QTextEdit.WidgetWidth)
        self.textBrowser_output.setObjectName("textBrowser_output")
        self.verticalLayout_2.addWidget(self.textBrowser_output)
        self.horizontalLayout_2.addLayout(self.verticalLayout_2)
        self.verticalLayout_4.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_4.addLayout(self.verticalLayout_4)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Google Translation —— author:小思緒"))
        self.label_title.setToolTip(_translate("MainWindow", "Test Result Helper 3.3.10 author:WuXian (2019.3.13)"))
        self.label_title.setText(_translate("MainWindow", "谷歌翻譯簡版   "))
        self.label_language1.setText(_translate("MainWindow", "English"))
        self.label_language2.setText(_translate("MainWindow", "中文(簡體)"))
        self.label_in.setText(_translate("MainWindow", "  檢測語言"))
        self.textEdit_input.setToolTip(_translate("MainWindow", "請輸入要翻譯的文本"))
        self.label_out.setText(_translate("MainWindow", "   翻譯結果  "))


    def textChanging_textEdit_input(self):
        # 輸入文本改變執行槽函式

        QtWidgets.QApplication.processEvents()
        inputTxt = self.textEdit_input.toPlainText()
        # 檢測當前語言型別
        self.textBrowser_output.setText('正在自動檢測語言...')
        QtWidgets.QApplication.processEvents() # 處理事件
        array = classify(inputTxt)# array中即檢測結果

        languageType='未知'
        # 根據語言型別調整對應顯示標簽
        if array[0] == 'zh':
            languageType='中文'
            font = QtGui.QFont()
            font.setFamily("楷體")
            font.setPointSize(14)
            self.label_language1.setText("中文(簡體)")
            self.label_language1.setFont(font)
            font.setPointSize(13)
            font.setFamily("Sitka Small")
            self.label_language2.setFont(font)
            self.label_language2.setText("English")
        elif array[0] == 'en':
            languageType = '英文'
            font = QtGui.QFont()
            font.setFamily("楷體")
            font.setPointSize(14)
            self.label_language2.setFont(font)
            self.label_language2.setText("中文(簡體)")

            font.setPointSize(13)
            font.setFamily("Sitka Small")
            self.label_language1.setFont(font)
            self.label_language1.setText("English")

        QtWidgets.QApplication.processEvents()
        if self.label_language1.text() == "中文(簡體)":
            formLang="zh-CN"# 輸入為中文
            toLang = "en"# 翻譯為英文
            font = QtGui.QFont()
            font.setFamily("微軟雅黑")
            font.setPointSize(10)
            font.setItalic(False)
            self.textEdit_input.setFont(font)

            font = QtGui.QFont()
            font.setFamily("Times New Roman")
            font.setPointSize(10)
            font.setItalic(True)
            self.textBrowser_output.setFont(font)
        else:
            formLang = "en" # 輸入為英文
            toLang = "zh-CN" # 翻譯為中文
            font = QtGui.QFont()
            font.setFamily("微軟雅黑")
            font.setPointSize(10)
            font.setItalic(False)
            self.textBrowser_output.setFont(font)

            font = QtGui.QFont()
            font.setFamily("Times New Roman")
            font.setPointSize(10)
            font.setItalic(True)
            self.textEdit_input.setFont(font)

        QtWidgets.QApplication.processEvents()
        self.textBrowser_output.setText('檢測語言:'+languageType)
        # 呼叫翻譯API進行翻譯
        self.textBrowser_output.append('正在翻譯...')

        QtWidgets.QApplication.processEvents()
        # 根據選取的翻譯方式選擇介面呼叫
        if self.type_trans=='googletrans':
            try:
                translator = Translator(service_urls=['translate.google.cn'])
                QtWidgets.QApplication.processEvents()
                # 呼叫谷歌翻譯API的方法翻譯
                translated_text = translator.translate(inputTxt, src=https://www.cnblogs.com/sixuwuxian/archive/2022/10/06/formLang, dest=toLang).text
                QtWidgets.QApplication.processEvents()
                self.textBrowser_output.setText(translated_text) # 在輸出框顯示結果
            except Exception as e:
                self.textBrowser_output.setText('呼叫谷歌翻譯API出錯')
        else:
            QtWidgets.QApplication.processEvents()
            # 呼叫自行撰寫的谷歌翻譯方法翻譯
            translated_text = TranslateByGoogle(inputTxt,formLang,toLang)
            QtWidgets.QApplication.processEvents()
            self.textBrowser_output.setText(translated_text) # 在輸出框顯示結果




    def clickButton_select(self):
        # 點擊交換語言按鈕槽函式,按鈕被點擊將兩邊顯示的語言型別交換
        if self.label_language1.text()=="English":
            font = QtGui.QFont()
            font.setFamily("楷體")
            font.setPointSize(14)
            self.label_language1.setText("中文(簡體)")
            self.label_language1.setFont(font)
            font.setPointSize(13)
            font.setFamily("Sitka Small")
            self.label_language2.setFont(font)
            self.label_language2.setText("English")
        else:
            font = QtGui.QFont()
            font.setFamily("楷體")
            font.setPointSize(14)
            self.label_language2.setText("中文(簡體)")
            self.label_language2.setFont(font)
            font.setPointSize(13)
            font.setFamily("Sitka Small")
            self.label_language1.setFont(font)
            self.label_language1.setText("English")

    def clickButton_trans(self):
        # 點擊按鈕彈出對話框,選擇翻譯要呼叫的介面型別
        items = ("googletrans","google website")
        item, ok = QInputDialog.getItem(self.centralwidget,"選擇翻譯方式","翻譯方式:",items,0,False)
        if ok:
            self.type_trans=item

    每次在控制元件3的文本輸入框中輸入文本,程式會自動呼叫對應槽函式檢測語言型別然后呼叫翻譯介面進行翻譯,顯示翻譯結果在控制元件4的文本瀏覽框中,其界面如下

圖片展示

    上面的一段代碼中定義了Ui_MainWindow的類,里面包含的是關于UI界面的生成以及內部邏輯,我們只需在外部呼叫該類顯示視窗就行了,呼叫并運行該類的代碼如下:

from GoogleTransUI import Ui_MainWindow
from sys import argv,exit
from PyQt5.QtWidgets import QApplication,QMainWindow

if __name__ == '__main__':
    app = QApplication(argv)
    window = QMainWindow()
    ui = Ui_MainWindow(window)
    window.show()
    exit(app.exec_())

    為了使界面簡潔美觀在代碼中使用了qss,在主視窗中利用setStyleSheet對其中的各控制元件設定了背景、圖示以及其他的美化設定,在本節上面的第一段代碼中為了代碼看起來美觀將其第40行代碼中的內容省略了,特此貼在最后有需要的朋友可以復制下面的代碼并將第40行代碼內容覆寫即可,至于里面的具體含義,這里限于篇幅真的不適合在這里詳細講了,在后面我會專門出個專欄講述的,這里就直接用好了,

MainWindow.setStyleSheet("#MainWindow,QInputDialog{border-image: url(:/newPrefix/images_test/light.png);}\n"
                                 "QMenuBar{border-color:transparent;}\n"
                                 "QToolButton[objectName=\"pushButton_doIt\"]{\n"
                                 "\n"
                                 "border:5px;\n"
                                 "}\n"
                                 "\n"
                                 "QToolButton[objectName=\"pushButton_doIt\"]:hover {\n"
                                 "image:url(:/newPrefix/images_test/run_hover.png);}\n"
                                 "\n"
                                 "QToolButton[objectName=\"pushButton_doIt\"]:pressed {\n"
                                 "image:url(:/newPrefix/images_test/run_pressed.png);}\n"
                                 "\n"
                                 "\n"
                                 "QScrollBar:vertical{\n"
                                 "\n"
                                 "background:transparent;\n"
                                 "padding:2px;\n"
                                 "\n"
                                 "border-radius:8px;\n"
                                 "max-width:14px;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:vertical{\n"
                                 "background:#9acd32;\n"
                                 "min-height:50px;\n"
                                 "border-radius:8px;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:vertical:hover{\n"
                                 "background:#9eb764;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:vertical:pressed{\n"
                                 "background:#9eb764;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::add-page:vertical{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::sub-page:vertical{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::add-line:vertical{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::sub-line:vertical{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollArea{\n"
                                 "border:0px;\n"
                                 "}\n"
                                 "\n"
                                 "\n"
                                 "QScrollBar:horizontal{\n"
                                 "background:transparent;\n"
                                 "padding:0px;\n"
                                 "border-radius:6px;\n"
                                 "max-height:12px;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:horizontal{\n"
                                 "background:#9acd32;\n"
                                 "min-width:50px;\n"
                                 "border-radius:6px;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:horizontal:hover{\n"
                                 "background:#9eb764;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::handle:horizontal:pressed{\n"
                                 "background:#9eb764;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::add-page:horizontal{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::sub-page:horizontal{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::add-line:horizontal{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "\n"
                                 "QScrollBar::sub-line:horizontal{\n"
                                 "background:none;\n"
                                 "}\n"
                                 "QToolButton::hover{\n"
                                 "border:0px;\n"
                                 "} ") # 主視窗qss格式

【下載鏈接】
    博文中涉及的全部程式檔案(包括圖片、UI檔案等)已打包上傳至博主的CSDN下載資源中,下載后運行runMain.py檔案即可運行,同時已將檔案打包編程成exe的可執行檔案(支持win7、win8、win10)可在我的百度網盤中下載后直接運行,檔案下載鏈接如下:

下載鏈接1:博文中涉及的完整程式檔案

檔案情況
下載鏈接2:翻譯軟體打包的可執行檔案
鏈接:https://pan.baidu.com/s/1qFYwPcVebji-jkx9vTS_xQ
提取碼:k1tp

可執行程式檔案
公眾號獲取
    本人微信公眾號已創建,點擊文末卡片并關注“AI技術研究與分享”,并回復“ST20190503”即可獲取詳細內容,

圖片展示

5. 結束語

    由于博主能力有限,博文中提及的方法與代碼即使經過測驗,也難免會有疏漏之處,希望您能熱心指出其中的錯誤,以便下次修改時能以一個更完美更嚴謹的樣子,呈現在大家面前,同時如果有更好的實作方法也請您不吝賜教,

    大家的點贊和關注是博主最大的動力,如果您想要獲取博文中的完整代碼檔案,可通過C幣或積分下載,沒有C幣或積分的朋友可在關注、點贊博文后提供郵箱,在評論區留言如:“請求完整代碼檔案,郵箱:[email protected]”,我會在第一時間發送給您,

人工智能博士,機器學習及機器視覺愛好者,公眾號主及B站UP主,專注專業知識整理與專案總結約稿、軟體專案開發、原理指導請聯系微信:sixuwuxian(備注來意),郵箱:[email protected],微信公眾號:“AI技術研究與分享”,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/510966.html

標籤:其他

上一篇:Django 出現 frame because it set X-Frame-Options to deny 錯誤

下一篇:python寫腳本測驗執行為什么要寫if __name__ == '__main__'

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more