歡迎光臨
每天分享高質量文章

Python 圖形用戶界面實戰 : PyQt5 實現摘要演算法計算

(點擊上方快速關註並設置為星標,一起學Python)

 

說起Python的圖形用戶界面 (GUI,  Graphical User Interface)設計,就讓人想到python的很多GUI庫,比如標準庫tkinter和第三方庫PyQt5,wxpython等等,在這裡我推薦使用PyQt5,因為它有個工具叫Qt Designer,可以直接手動設置界面,把控制元件拖放到指定位置去。而且QT支持的控制元件比標準庫tkinter多,而且還比它設計的GUI好看,所以我用上PyQt5後就強烈的喜歡了它。

 

Qt Designer打開後界面

Pyqt5安裝用pip安裝即可,QtDesigner配置和安裝詳見:

https://blog.csdn.net/hubz131/article/details/79352443

 

接下來介紹一下摘要演算法,訊息摘要演算法的主要特征是加密過程不需要密鑰,並且經過加密的資料無法被解密,只有輸入相同的明文資料經過相同的訊息摘要演算法才能得到相同的密文,比如如下代碼:

>>> import hashlib as h
>>> str1='你打球像蔡徐坤'
>>>bytestring=str1.encode('UTF-8')         #生成bytes型別
>>> m=h.md5()                         #產生MD5物件
>>> m.update(bytestring)                 #把產生的bytes加入到m物件中
>>> m.hexdigest()                        #生成摘要
'edea833bc2b9c8d69cffdc2a93151df1'

只有2個bytes型別的字串完全相同,他們生成的摘要才完全一致,稍微改動一處地方生產的摘要就完全不一樣,比如

 

字串(utf-8編碼) 摘要md5
訊息摘要演算法的主要特征是加密過程不需要密鑰 e408fc959a50d64ebac335841f98ed88
訊息摘要演算法的主要特征是加密過程不需要密鑰? 1a9890a26144bc94bee18a53a7c83faa

Python的標準庫hashlib有很多這樣的加密演算法,除了經典的MD5還有sha1,sha224,sha512等。

當Qt Desiger配置好後,我們打開它

 

 

生成一個空白的界面

 

按如下設計:

 

將物件Form的windowTitle屬性改為摘要演算法

 

 

組合框內容如下,註意第一個是預設

 

 

 

最後儲存,生成ui檔案,如果你使用pycharm的話,最好將ui檔案儲存到pycharm的檔案夾內,然後這樣

 

 

就在同一個檔案夾下,生成同名的.py檔案了!

 

打開那個同名的py檔案,我們看到生成了一個名叫Ui_Form的類和它的兩個方法setupUi和retranslateUi,這兩個方法在做什麼估計看一下大家都懂了,我們不必理解pyqt5的代碼,首先在首行匯入sys庫hashlib庫(簡寫為h),在同名的py檔案末尾,加上

app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())

然後點擊運行,剛剛做出來的界面就活靈活現的展現了出來,就是點擊按鈕沒反應

 

 

我們需要給按鈕增加一個信號槽(當點擊事件發生之後,比如,按鈕檢測到自己被點擊了一下,它就會發出一個信號(signal)。這種發出是沒有目的的,類似廣播。如果有物件對這個信號感興趣,它就會使用連接(connect)函式,意思是,將想要處理的信號和自己的一個函式(稱為槽(slot))系結來處理這個信號。也就是說,當信號發出時,被連接的槽函式會自動被回呼。這就類似觀察者樣式:當發生了感興趣的事件,某一個操作就會被自動觸發。)

我們給Ui_Form的類增加一個方法,叫做jisuan

sf={'md5':h.md5,'sha1':h.sha1,'sha224':h.sha224,'sha256':h.sha256,
                'sha384':h.sha384,'sha512':h.sha512,'sha3_224':h.sha3_224,
         'sha3_256':h.sha3_256,'sha3_384':h.sha3_384,'sha3_512':h.sha3_512}

    def jisuan(self):
       zhaiya=self.comboBox.currentText()
       bianma = self.comboBox_2.currentText()
       string=self.plainTextEdit.toPlainText()
       fun=sf[zhaiya]
       sha=fun(string.encode(bianma))
       zfc=sha.hexdigest()
       self.plainTextEdit_2.setPlainText(zfc)

sf是外部變數,定義一個字典,字典的鍵值對應字串和相應的函式,這樣我們就定義好了一個這樣的函式,最後就是,將這函式和按鈕點擊鏈接起來,在setupUi方法最末尾加上

 self.pushButton.clicked.connect(self.jisuan)

即可。

點擊運行,如下,很優秀。

 

 

 

完整代碼如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '摘要演算法.ui'
#
# Created by: PyQt5 UI code generator 5.11.2
#
# WARNING! All changes made in this file will be lost!
importsys
fromPyQt5importQtCore,QtGui, QtWidgets
importhashlibash

sf={'md5':h.md5,'sha1':h.sha1,'sha224':h.sha224,'sha256':h.sha256,
    'sha384':h.sha384,'sha512':h.sha512,'sha3_224':h.sha3_224,
    'sha3_256':h.sha3_256,'sha3_384':h.sha3_384,'sha3_512':h.sha3_512}

classUi_Form(object):
    def setupUi(self,Form):
        Form.setObjectName("Form")
        Form.resize(367,300)
        self.plainTextEdit= QtWidgets.QPlainTextEdit(Form)
        self.plainTextEdit.setGeometry(QtCore.QRect(10,20,351,71))
        self.plainTextEdit.setObjectName("plainTextEdit")
        self.label= QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(130,0,101,16))
        self.label.setObjectName("label")
        self.label_2= QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(10,100,54,21))
        self.label_2.setObjectName("label_2")
        self.comboBox= QtWidgets.QComboBox(Form)
        self.comboBox.setGeometry(QtCore.QRect(60,100,71,22))
        self.comboBox.setObjectName("comboBox")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.comboBox.addItem("")
        self.pushButton= QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(260,100,81,31))
        self.pushButton.setObjectName("pushButton")
        self.groupBox= QtWidgets.QGroupBox(Form)
        self.groupBox.setGeometry(QtCore.QRect(0,130,361,161))
        self.groupBox.setObjectName("groupBox")
        self.plainTextEdit_2= QtWidgets.QPlainTextEdit(self.groupBox)
        self.plainTextEdit_2.setGeometry(QtCore.QRect(10,20,351,131))
        self.plainTextEdit_2.setObjectName("plainTextEdit_2")
        self.label_3= QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(140,101,31,21))
        self.label_3.setObjectName("label_3")
        self.comboBox_2= QtWidgets.QComboBox(Form)
        self.comboBox_2.setGeometry(QtCore.QRect(170,100,71,22))
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_2.addItem("")
        self.comboBox_2.addItem("")
        self.pushButton.clicked.connect(self.jisuan)

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

    def retranslateUi(self,Form):
        _translate =QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form","摘要演算法"))
        self.label.setText(_translate("Form","需要摘要的字串"))
        self.label_2.setText(_translate("Form","摘要演算法"))
        self.comboBox.setItemText(0,_translate("Form","md5"))
        self.comboBox.setItemText(1,_translate("Form","sha1"))
        self.comboBox.setItemText(2,_translate("Form","sha1"))
        self.comboBox.setItemText(3,_translate("Form","sha224"))
        self.comboBox.setItemText(4,_translate("Form","sha256"))
        self.comboBox.setItemText(5,_translate("Form","sha384"))
        self.comboBox.setItemText(6,_translate("Form","sha512"))
        self.comboBox.setItemText(7,_translate("Form","sha3_224"))
        self.comboBox.setItemText(8,_translate("Form","sha3_256"))
        self.comboBox.setItemText(9,_translate("Form","sha3_384"))
        self.comboBox.setItemText(10,_translate("Form","sha3_512"))
        self.pushButton.setText(_translate("Form","計算"))
        self.groupBox.setTitle(_translate("Form","結果"))
        self.label_3.setText(_translate("Form","編碼"))
        self.comboBox_2.setItemText(0,_translate("Form","UTF-8"))
        self.comboBox_2.setItemText(1,_translate("Form","GBK"))

    def jisuan(self):
        zhaiya=self.comboBox.currentText()
        bianma = self.comboBox_2.currentText()
        string=self.plainTextEdit.toPlainText()
        fun=sf[zhaiya]
        sha=fun(string.encode(bianma))
        zfc=sha.hexdigest()
        self.plainTextEdit_2.setPlainText(zfc)

app = QtWidgets.QApplication(sys.argv)
mainWindow = QtWidgets.QMainWindow()
ui = Ui_Form()
ui.setupUi(mainWindow)
mainWindow.show()
sys.exit(app.exec_())

    已同步到看一看
    赞(0)

    分享創造快樂