Python 图形用户界面实战 : PyQt5 实现摘要算法计算

来自: Python那些事(微信号:PythonSomething),作者:少年阿泽

说起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_())
推荐↓↓↓
Python编程
上一篇:浅谈动态类型领域中 Python 的变量、对象以及引用。 下一篇:我爬取豆瓣10万短评,告诉你《复仇者联盟4》在讲什么?