首先要pycharm版本必须在3.9或者3.8,如果python版本过高建议到python官网重新安装并配置环境和解释器
在python3.9中安装两个第三方库,如下
安装过程可参考
https://zhuanlan.zhihu.com/p/162866700
打开designer.exe
其中明文等字样选中label拖动,文本框选中lineEdit,文本框内的字在右侧属性编辑器找到placeholderText进行输入即可,按钮选中pushbutton,对里面的文本进行编辑即可
解决好后保存为后缀是.ui的文件,回到pycharm中,找到你刚刚保存的文件,右键选中External Tools,选择pyUIC即可将ui文件转化为py文件
(26条消息) 在pycharm中将.ui文件转化为.py文件_pycharm导出.py文件_knighthood2001的博客-优快云博客
打开py文件,得到下面这部分代码
1.注意核对导入的库是否完全
2.删除三句,注意MainWindows在本文为Caesar
MainWindow.setCentralWidget(self.centralwidget)
MainWindow.setMenuBar(self.menubar)
MainWindow.setStatusBar(self.statusbar)
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import QApplication, QMessageBox import sys class Ui_Caesar(object): def setupUi(self, Caesar): Caesar.setObjectName("Caesar") Caesar.resize(463, 386) self.centralwidget = QtWidgets.QWidget(Caesar) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(30, 30, 41, 16)) self.label.setObjectName("label") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(30, 50, 421, 41)) self.lineEdit.setObjectName("lineEdit") self.label_2 = QtWidgets.QLabel(self.centralwidget) self.label_2.setGeometry(QtCore.QRect(30, 100, 54, 12)) self.label_2.setObjectName("label_2") self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_2.setGeometry(QtCore.QRect(30, 120, 91, 21)) self.lineEdit_2.setObjectName("lineEdit_2") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(160, 120, 91, 21)) self.pushButton.setCheckable(False) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.Button1) self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setGeometry(QtCore.QRect(30, 150, 54, 12)) self.label_3.setObjectName("label_3") self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_3.setGeometry(QtCore.QRect(30, 170, 421, 41)) self.lineEdit_3.setObjectName("lineEdit_3") self.label_4 = QtWidgets.QLabel(self.centralwidget) self.label_4.setGeometry(QtCore.QRect(30, 220, 54, 12)) self.label_4.setObjectName("label_4") self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_4.setGeometry(QtCore.QRect(30, 240, 91, 21)) self.lineEdit_4.setObjectName("lineEdit_4") self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_2.setGeometry(QtCore.QRect(280, 120, 91, 21)) self.pushButton_2.setCheckable(False) self.pushButton_2.setObjectName("pushButton_2") self.pushButton_2.clicked.connect(self.Button2) self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit_5.setGeometry(QtCore.QRect(30, 290, 421, 51)) self.lineEdit_5.setObjectName("lineEdit_5") self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_3.setGeometry(QtCore.QRect(160, 240, 91, 21)) self.pushButton_3.setCheckable(False) self.pushButton_3.setObjectName("pushButton_3") self.pushButton_3.clicked.connect(self.Button3) self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21)) self.pushButton_4.setCheckable(False) self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.Button4) self.label_5 = QtWidgets.QLabel(self.centralwidget) self.label_5.setGeometry(QtCore.QRect(30, 270, 81, 16)) self.label_5.setObjectName("label_5") self.menubar = QtWidgets.QMenuBar(Caesar) self.menubar.setGeometry(QtCore.QRect(0, 0, 463, 22)) self.menubar.setObjectName("menubar") self.statusbar = QtWidgets.QStatusBar(Caesar) self.statusbar.setObjectName("statusbar") self.retranslateUi(Caesar) QtCore.QMetaObject.connectSlotsByName(Caesar) def retranslateUi(self, Caesar): _translate = QtCore.QCoreApplication.translate Caesar.setWindowTitle(_translate("Caesar", "MainWindow")) self.label.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">明文</span></p></body></html>")) self.lineEdit.setPlaceholderText(_translate("Caesar", "请输入明文")) self.lineEdit_2.setPlaceholderText(_translate("Caesar", "请输入加密密钥")) self.pushButton.setText(_translate("Caesar", "加法加密")) self.label_3.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">密文</span></p></body></html>")) self.lineEdit_3.setPlaceholderText(_translate("Caesar", "显示加密后的密文")) self.label_4.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密密钥</span></p></body></html>")) self.lineEdit_4.setPlaceholderText(_translate("Caesar", "请输入解密密钥")) self.pushButton_3.setText(_translate("Caesar", "加法解密")) self.lineEdit_5.setPlaceholderText(_translate("Caesar", "显示解密后的明文")) self.pushButton_2.setText(_translate("Caesar", "乘法加密")) self.pushButton_4.setText(_translate("Caesar", "乘法解密")) self.label_5.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密后的明文</span></p></body></html>")) self.label_2.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">加密密钥</span></p></body></html>"))
3.在最后放入
#显示画面
if __name__ == "__main__": QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#固定窗口大小,保持其与你在designer中的界面大小一致 app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QWidget() ui = Ui_Caesar() # 这是原py中的类,因人而异哦,这个Caesar一帮来说是MainWindow ui.setupUi(widget) widget.show() sys.exit(app.exec_())
完成上面步骤即可运行看看是否界面有显示
接下来是算法设计
关于按钮这部分需要在四个按钮插入第三句和最后一句
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget) self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21)) self.pushButton_4.setCheckable(False)#设置按钮初始状态
self.pushButton_4.setObjectName("pushButton_4") self.pushButton_4.clicked.connect(self.Button4)#当按钮被点击变为True,跳转到Button4这个函数
四个函数对应着加法加密,乘法加密,加法解密,乘法解密
def Button1(self): result="" str=self.lineEdit.text()#获取文本框内容 n=self.lineEdit_2.text()#注意此时获取的形式为字符串 n=isnumber(n)#实现数字字母通享 for i in str: j=i.upper() if 64<ord(j.upper())<92: k = chr((((ord(j) - 65) + int(n)) % 26 + 65)) result += k else: continue self.lineEdit_3.setText(result)#输出到文本框上 def Button2(self): result = "" str = self.lineEdit.text() n = self.lineEdit_2.text() n = isnumber(n) if int(n)==0: msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n)) msg_box.exec_() elif int(n)<26 and 26%int(n)!=0 and int(n)!=0: for i in str: j = i.upper() if 64 < ord(j.upper()) < 92: k = chr((((ord(j) - 65) * int(n)) % 26 + 65)) result += k else: continue self.lineEdit_3.setText(result) else: msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n)) msg_box.exec_() def Button3(self): result = "" str = self.lineEdit_3.text() n = self.lineEdit_4.text() n = isnumber(n) for i in str: j=i.upper() if 64 < ord(j) < 92: k = chr((((ord(j) - 65) - int(n)) % 26 + 65)) result += k self.lineEdit_5.setText(result) def Button4(self): result = "" str = self.lineEdit_3.text() n = self.lineEdit_4.text() n = isnumber(n) c=int(n) s=findModReverse(c,26) print(s) for i in str: j = i.upper() if 64 < ord(j) < 92: k = chr((((ord(j) - 65) * s) % 26 + 65)) result += k self.lineEdit_5.setText(result)
用于实现数字字母通享,把输入的密钥进行处理
def isnumber(str): if str.isdigit() != 1: m = str.upper() return ord(m)-65 else: return str
关于加法算法比较简单不展开
而乘法解密需要求逆,该算法用于求出原来输入密钥的逆
对于p是有要求限制的在乘法加密中,即(n,p)=1,就是n和p要互素(见上面按钮2和4进行判断)
判断以后以弹窗的形式进行提醒
msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
msg_box.exec_()
求逆过程大概为:假设n=26(固定的) p=5
26=5*5+1
1=26-5*5即1=26+(-5)*5
将式子转化为1=n+k*p 此时逆为k 也就是(-5)mod26=21
该算法用于求逆
def gcd(a, b):
while a != 0:
a, b = b % a, a
return b
def findModReverse(n, p): # 这个扩展欧几里得算法求模逆
if gcd(n, p) != 1:
return None
u1, u2, u3 = 1, 0, n
v1, v2, v3 = 0, 1, p
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % p
代码如下:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '密码算法(数字字母通享版).ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMessageBox
import sys
def gcd(a, b):
while a != 0:
a, b = b % a, a
return b
def findModReverse(n, p): # 这个扩展欧几里得算法求模逆
if gcd(n, p) != 1:
return None
u1, u2, u3 = 1, 0, n
v1, v2, v3 = 0, 1, p
while v3 != 0:
q = u3 // v3
v1, v2, v3, u1, u2, u3 = (u1 - q * v1), (u2 - q * v2), (u3 - q * v3), v1, v2, v3
return u1 % p
def isnumber(str):
if str.isdigit() != 1:
m = str.upper()
return ord(m)-65
else:
return str
class Ui_Caesar(object):
def setupUi(self, Caesar):
Caesar.setObjectName("Caesar")
Caesar.resize(463, 386)
self.centralwidget = QtWidgets.QWidget(Caesar)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(30, 30, 41, 16))
self.label.setObjectName("label")
self.lineEdit = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit.setGeometry(QtCore.QRect(30, 50, 421, 41))
self.lineEdit.setObjectName("lineEdit")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(30, 100, 54, 12))
self.label_2.setObjectName("label_2")
self.lineEdit_2 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_2.setGeometry(QtCore.QRect(30, 120, 91, 21))
self.lineEdit_2.setObjectName("lineEdit_2")
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(160, 120, 91, 21))
self.pushButton.setCheckable(False)
self.pushButton.setObjectName("pushButton")
self.pushButton.clicked.connect(self.Button1)
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(30, 150, 54, 12))
self.label_3.setObjectName("label_3")
self.lineEdit_3 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_3.setGeometry(QtCore.QRect(30, 170, 421, 41))
self.lineEdit_3.setObjectName("lineEdit_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(30, 220, 54, 12))
self.label_4.setObjectName("label_4")
self.lineEdit_4 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_4.setGeometry(QtCore.QRect(30, 240, 91, 21))
self.lineEdit_4.setObjectName("lineEdit_4")
self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(280, 120, 91, 21))
self.pushButton_2.setCheckable(False)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_2.clicked.connect(self.Button2)
self.lineEdit_5 = QtWidgets.QLineEdit(self.centralwidget)
self.lineEdit_5.setGeometry(QtCore.QRect(30, 290, 421, 51))
self.lineEdit_5.setObjectName("lineEdit_5")
self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_3.setGeometry(QtCore.QRect(160, 240, 91, 21))
self.pushButton_3.setCheckable(False)
self.pushButton_3.setObjectName("pushButton_3")
self.pushButton_3.clicked.connect(self.Button3)
self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
self.pushButton_4.setGeometry(QtCore.QRect(280, 240, 91, 21))
self.pushButton_4.setCheckable(False)
self.pushButton_4.setObjectName("pushButton_4")
self.pushButton_4.clicked.connect(self.Button4)
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(30, 270, 81, 16))
self.label_5.setObjectName("label_5")
self.menubar = QtWidgets.QMenuBar(Caesar)
self.menubar.setGeometry(QtCore.QRect(0, 0, 463, 22))
self.menubar.setObjectName("menubar")
self.statusbar = QtWidgets.QStatusBar(Caesar)
self.statusbar.setObjectName("statusbar")
self.retranslateUi(Caesar)
QtCore.QMetaObject.connectSlotsByName(Caesar)
def Button1(self):
result=""
str=self.lineEdit.text()
n=self.lineEdit_2.text()
n=isnumber(n)
for i in str:
j=i.upper()
if 64<ord(j.upper())<92:
k = chr((((ord(j) - 65) + int(n)) % 26 + 65))
result += k
else:
continue
self.lineEdit_3.setText(result)
def Button2(self):
result = ""
str = self.lineEdit.text()
n = self.lineEdit_2.text()
n = isnumber(n)
if int(n)==0:
msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
msg_box.exec_()
elif int(n)<26 and 26%int(n)!=0 and int(n)!=0:
for i in str:
j = i.upper()
if 64 < ord(j.upper()) < 92:
k = chr((((ord(j) - 65) * int(n)) % 26 + 65))
result += k
else:
continue
self.lineEdit_3.setText(result)
else:
msg_box = QMessageBox(QMessageBox.Warning, '警告', "{}不能作为乘法算法的密钥".format(n))
msg_box.exec_()
def Button3(self):
result = ""
str = self.lineEdit_3.text()
n = self.lineEdit_4.text()
n = isnumber(n)
for i in str:
j=i.upper()
if 64 < ord(j) < 92:
k = chr((((ord(j) - 65) - int(n)) % 26 + 65))
result += k
self.lineEdit_5.setText(result)
def Button4(self):
result = ""
str = self.lineEdit_3.text()
n = self.lineEdit_4.text()
n = isnumber(n)
c=int(n)
s=findModReverse(c,26)
for i in str:
j = i.upper()
if 64 < ord(j) < 92:
k = chr((((ord(j) - 65) * s) % 26 + 65))
result += k
self.lineEdit_5.setText(result)
def retranslateUi(self, Caesar):
_translate = QtCore.QCoreApplication.translate
Caesar.setWindowTitle(_translate("Caesar", "MainWindow"))
self.label.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">明文</span></p></body></html>"))
self.lineEdit.setPlaceholderText(_translate("Caesar", "请输入明文"))
self.lineEdit_2.setPlaceholderText(_translate("Caesar", "请输入加密密钥"))
self.pushButton.setText(_translate("Caesar", "加法加密"))
self.label_3.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">密文</span></p></body></html>"))
self.lineEdit_3.setPlaceholderText(_translate("Caesar", "显示加密后的密文"))
self.label_4.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密密钥</span></p></body></html>"))
self.lineEdit_4.setPlaceholderText(_translate("Caesar", "请输入解密密钥"))
self.pushButton_3.setText(_translate("Caesar", "加法解密"))
self.lineEdit_5.setPlaceholderText(_translate("Caesar", "显示解密后的明文"))
self.pushButton_2.setText(_translate("Caesar", "乘法加密"))
self.pushButton_4.setText(_translate("Caesar", "乘法解密"))
self.label_5.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">解密后的明文</span></p></body></html>"))
self.label_2.setText(_translate("Caesar", "<html><head/><body><p><span style=\" font-weight:600;\">加密密钥</span></p></body></html>"))
if __name__ == "__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
app = QtWidgets.QApplication(sys.argv)
widget = QtWidgets.QWidget()
ui = Ui_Caesar() # 这是原py中的类,因人而异哦
ui.setupUi(widget)
widget.show()
sys.exit(app.exec_())
运行结果如下: