Смена виджета в главном окне PyQt
Есть две программы. Нужно объединить их в одну с возможностью переключения между собой посредством радиокнопок таким образом, чтобы менялся только определенный Widget.
Код сгенерированный Qt Designer:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(654, 215)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.forshifr = QtWidgets.QPlainTextEdit(self.centralwidget)
self.forshifr.setGeometry(QtCore.QRect(280, 40, 201, 21))
self.forshifr.setObjectName("forshifr")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 30, 271, 41))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 70, 261, 21))
self.label_2.setObjectName("label_2")
self.key = QtWidgets.QPlainTextEdit(self.centralwidget)
self.key.setGeometry(QtCore.QRect(280, 70, 201, 21))
self.key.setObjectName("key")
self.btn_donshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_donshifr.setGeometry(QtCore.QRect(490, 40, 71, 21))
self.btn_donshifr.setObjectName("btn_donshifr")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(10, 100, 271, 16))
self.label_3.setObjectName("label_3")
self.fornoshifr = QtWidgets.QPlainTextEdit(self.centralwidget)
self.fornoshifr.setGeometry(QtCore.QRect(280, 100, 201, 21))
self.fornoshifr.setObjectName("fornoshifr")
self.btn_donnoshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_donnoshifr.setGeometry(QtCore.QRect(490, 100, 71, 23))
self.btn_donnoshifr.setObjectName("btn_donnoshifr")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(10, 130, 131, 16))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(10, 150, 131, 16))
self.label_5.setObjectName("label_5")
self.label_no = QtWidgets.QLabel(self.centralwidget)
self.label_no.setGeometry(QtCore.QRect(190, 130, 221, 20))
self.label_no.setText("")
self.label_no.setObjectName("label_no")
self.label_yes = QtWidgets.QLabel(self.centralwidget)
self.label_yes.setGeometry(QtCore.QRect(190, 150, 221, 20))
self.label_yes.setText("")
self.label_yes.setObjectName("label_yes")
self.btn_unshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_unshifr.setGeometry(QtCore.QRect(570, 40, 75, 21))
self.btn_unshifr.setObjectName("btn_unshifr")
self.btn_donkey = QtWidgets.QPushButton(self.centralwidget)
self.btn_donkey.setGeometry(QtCore.QRect(490, 70, 71, 23))
self.btn_donkey.setObjectName("btn_donkey")
self.btn_unkey = QtWidgets.QPushButton(self.centralwidget)
self.btn_unkey.setGeometry(QtCore.QRect(570, 70, 75, 23))
self.btn_unkey.setObjectName("btn_unkey")
self.btn_unnoshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_unnoshifr.setGeometry(QtCore.QRect(570, 100, 75, 23))
self.btn_unnoshifr.setObjectName("btn_unnoshifr")
self.btnoutput1 = QtWidgets.QPushButton(self.centralwidget)
self.btnoutput1.setGeometry(QtCore.QRect(140, 130, 31, 16))
self.btnoutput1.setObjectName("btnoutput1")
self.btnoutput2 = QtWidgets.QPushButton(self.centralwidget)
self.btnoutput2.setGeometry(QtCore.QRect(140, 150, 31, 16))
self.btnoutput2.setObjectName("btnoutput2")
self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget)
self.horizontalLayoutWidget.setGeometry(QtCore.QRect(20, 0, 611, 41))
self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.DES = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
self.DES.setObjectName("DES")
self.horizontalLayout.addWidget(self.DES)
self.RSA = QtWidgets.QRadioButton(self.horizontalLayoutWidget)
self.RSA.setObjectName("RSA")
self.horizontalLayout.addWidget(self.RSA)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 654, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Введите сообщение, которое нужно зашифровать:"))
self.label_2.setText(_translate("MainWindow", "Введите ключ для шифрования и расшифрования:"))
self.btn_donshifr.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.label_3.setText(_translate("MainWindow", "Введите сообщение, которое нужно расшифровать:"))
self.btn_donnoshifr.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.label_4.setText(_translate("MainWindow", "Зашифрованный текст:"))
self.label_5.setText(_translate("MainWindow", "Расшифрованный текст:"))
self.btn_unshifr.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btn_donkey.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.btn_unkey.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btn_unnoshifr.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btnoutput1.setText(_translate("MainWindow", "->"))
self.btnoutput2.setText(_translate("MainWindow", "->"))
self.DES.setText(_translate("MainWindow", "DES"))
self.RSA.setText(_translate("MainWindow", "RSA"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Код первого приложения (DES):
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication
from DES1 import MyDES
import copy
Form, Window = uic.loadUiType("DES11.ui")
app = QApplication([])
window = Window()
form = Form()
form.setupUi(window)
window.show()
def on_deshifr(): # Шифрованный текст в файл
fornoshifr = form.forshifr.toPlainText() # Взятие текста из поля
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(fornoshifr)
else:
lines[0] = fornoshifr
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_shifr(): # Исходный текст в файл
forshifr = form.forshifr.toPlainText() # Взятие текста из поля
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(forshifr)
else:
lines[0] = forshifr
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_unshifr(): # Исходный текст из файла
file = open('noshifr.txt', 'r')
NOshifr = file.readlines()
if len(NOshifr) == 0:
form.forshifr.setPlainText('')
else:
form.forshifr.setPlainText(NOshifr[0])
file.close()
def on_unnoshifr(): # Шифрованный текст из файла
file = open('shifr.txt', 'r')
Shifr = file.readlines()
if len(Shifr) == 0:
form.fornoshifr.setPlainText('')
else:
form.fornoshifr.setPlainText(Shifr[0])
file.close()
def on_donkey(): # Ключ в файл
Key = form.key.toPlainText() # Взятие текста из поля
file = open('key.txt', 'r')
lines = file.readlines()
if len(lines)==0:
lines.append(Key)
else:
lines[0] = Key
save_changes = open('key.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_unkey(): # Ключ из файла
file = open('key.txt', 'r')
KKey = file.readlines()
if len(KKey) == 0:
form.key.setPlainText('')
else:
form.key.setPlainText(KKey[0])
file.close()
def on_output1(): # Вывод шифрованного сообщения
key = form.key.toPlainText() # Взятие ключа из поля
md = MyDES() # Создание объекта класса
forshifr = form.forshifr.toPlainText() # Взятие текста из поля
shifr = md.encode(forshifr, key) # Шифрованное сообщение
file = open('shifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(shifr)
else:
lines[0] = shifr
save_changes = open('shifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
form.label_no.setText(shifr) # Вывод на экран шифрованное сообщение
def on_output2(): # Вывод дешифрованного сообщения
key = form.key.toPlainText()
md = MyDES()
fornoshifr = form.fornoshifr.toPlainText()
noshifr = md.decode(fornoshifr, key)
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(noshifr)
else:
lines[0] = noshifr
file.close()
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
form.label_yes.setText(noshifr)
form.btn_donshifr.clicked.connect(on_shifr) # ЗАГРУЗИТЬ В ФАЙЛ нешифрованное
form.btn_donnoshifr.clicked.connect(on_deshifr) # ЗАГРУЗИТЬ В ФАЙЛ шифрованное
form.btn_unshifr.clicked.connect(on_unshifr) # ВЫГРУЗИТЬ ИЗ ФАЙЛА нешифрованное
form.btn_unnoshifr.clicked.connect(on_unnoshifr) # ВЫГРУЗИТЬ ИЗ ФАЙЛА шифрованное
form.btn_donkey.clicked.connect(on_donkey) # ЗАГРУЗИТЬ В ФАЙЛ ключ
form.btn_unkey.clicked.connect(on_unkey) # ВЫГРУЗИТЬ В ФАЙЛ ключ
form.btnoutput1.clicked.connect(on_output1) # ВЫВОД нешифрованное
form.btnoutput2.clicked.connect(on_output2) # ВЫВОД шифрованное
app.exec_()
Второе приложение (RSA) по функционалу аналогично первому (DES)
Ответы (1 шт):
Я не проверял логику вашего приложения, а просто покажу как реализовать вашу задумку с использованием виджета QStackedWidget.
Класс QStackedWidget предоставляет стек виджетов, в котором одновременно виден только один виджет. Больше https://doc.qt.io/qt-5/qstackedwidget.html
Обратите внимание, что я убрал виджеты QRadioButton из файла созданного в Qt Designer и перенес их в основное окно.
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(654, 215)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.forshifr = QtWidgets.QPlainTextEdit(self.centralwidget)
self.forshifr.setGeometry(QtCore.QRect(280, 40, 201, 21))
self.forshifr.setObjectName("forshifr")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 30, 271, 41))
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 70, 261, 21))
self.label_2.setObjectName("label_2")
self.key = QtWidgets.QPlainTextEdit(self.centralwidget)
self.key.setGeometry(QtCore.QRect(280, 70, 201, 21))
self.key.setObjectName("key")
self.btn_donshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_donshifr.setGeometry(QtCore.QRect(490, 40, 71, 21))
self.btn_donshifr.setObjectName("btn_donshifr")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(10, 100, 271, 16))
self.label_3.setObjectName("label_3")
self.fornoshifr = QtWidgets.QPlainTextEdit(self.centralwidget)
self.fornoshifr.setGeometry(QtCore.QRect(280, 100, 201, 21))
self.fornoshifr.setObjectName("fornoshifr")
self.btn_donnoshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_donnoshifr.setGeometry(QtCore.QRect(490, 100, 71, 23))
self.btn_donnoshifr.setObjectName("btn_donnoshifr")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(10, 130, 131, 16))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(10, 150, 131, 16))
self.label_5.setObjectName("label_5")
self.label_no = QtWidgets.QLabel(self.centralwidget)
self.label_no.setGeometry(QtCore.QRect(190, 130, 221, 20))
self.label_no.setText("")
self.label_no.setObjectName("label_no")
self.label_yes = QtWidgets.QLabel(self.centralwidget)
self.label_yes.setGeometry(QtCore.QRect(190, 150, 221, 20))
self.label_yes.setText("")
self.label_yes.setObjectName("label_yes")
self.btn_unshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_unshifr.setGeometry(QtCore.QRect(570, 40, 75, 21))
self.btn_unshifr.setObjectName("btn_unshifr")
self.btn_donkey = QtWidgets.QPushButton(self.centralwidget)
self.btn_donkey.setGeometry(QtCore.QRect(490, 70, 71, 23))
self.btn_donkey.setObjectName("btn_donkey")
self.btn_unkey = QtWidgets.QPushButton(self.centralwidget)
self.btn_unkey.setGeometry(QtCore.QRect(570, 70, 75, 23))
self.btn_unkey.setObjectName("btn_unkey")
self.btn_unnoshifr = QtWidgets.QPushButton(self.centralwidget)
self.btn_unnoshifr.setGeometry(QtCore.QRect(570, 100, 75, 23))
self.btn_unnoshifr.setObjectName("btn_unnoshifr")
self.btnoutput1 = QtWidgets.QPushButton(self.centralwidget)
self.btnoutput1.setGeometry(QtCore.QRect(140, 130, 31, 16))
self.btnoutput1.setObjectName("btnoutput1")
self.btnoutput2 = QtWidgets.QPushButton(self.centralwidget)
self.btnoutput2.setGeometry(QtCore.QRect(140, 150, 31, 16))
self.btnoutput2.setObjectName("btnoutput2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 654, 21))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "Введите сообщение, которое нужно зашифровать:"))
self.label_2.setText(_translate("MainWindow", "Введите ключ для шифрования и расшифрования:"))
self.btn_donshifr.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.label_3.setText(_translate("MainWindow", "Введите сообщение, которое нужно расшифровать:"))
self.btn_donnoshifr.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.label_4.setText(_translate("MainWindow", "Зашифрованный текст:"))
self.label_5.setText(_translate("MainWindow", "Расшифрованный текст:"))
self.btn_unshifr.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btn_donkey.setText(_translate("MainWindow", "ЗАГРУЗИТЬ"))
self.btn_unkey.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btn_unnoshifr.setText(_translate("MainWindow", "ВЫГРУЗИТЬ"))
self.btnoutput1.setText(_translate("MainWindow", "->"))
self.btnoutput2.setText(_translate("MainWindow", "->"))
class WindowDES(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# тут ваша логика для WindowDES
self.btn_donshifr.clicked.connect(self.on_shifr) # ЗАГРУЗИТЬ В ФАЙЛ нешифрованное
self.btn_donnoshifr.clicked.connect(self.on_deshifr) # ЗАГРУЗИТЬ В ФАЙЛ шифрованное
self.btn_unshifr.clicked.connect(self.on_unshifr) # ВЫГРУЗИТЬ ИЗ ФАЙЛА нешифрованное
self.btn_unnoshifr.clicked.connect(self.on_unnoshifr) # ВЫГРУЗИТЬ ИЗ ФАЙЛА шифрованное
self.btn_donkey.clicked.connect(self.on_donkey) # ЗАГРУЗИТЬ В ФАЙЛ ключ
self.btn_unkey.clicked.connect(self.on_unkey) # ВЫГРУЗИТЬ В ФАЙЛ ключ
self.btnoutput1.clicked.connect(self.on_output1) # ВЫВОД нешифрованное
self.btnoutput2.clicked.connect(self.on_output2) # ВЫВОД шифрованное
self.lines = []
def on_deshifr(self): # Шифрованный текст в файл
fornoshifr = self.forshifr.toPlainText() # Взятие текста из поля
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(fornoshifr)
else:
lines[0] = fornoshifr
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_shifr(self): # Исходный текст в файл
forshifr = self.forshifr.toPlainText() # Взятие текста из поля
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(forshifr)
else:
lines[0] = forshifr
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_unshifr(self): # Исходный текст из файла
file = open('noshifr.txt', 'r')
NOshifr = file.readlines()
if len(NOshifr) == 0:
self.forshifr.setPlainText('')
else:
self.forshifr.setPlainText(NOshifr[0])
file.close()
def on_unnoshifr(self): # Шифрованный текст из файла
file = open('shifr.txt', 'r')
Shifr = file.readlines()
if len(Shifr) == 0:
self.fornoshifr.setPlainText('')
else:
self.fornoshifr.setPlainText(Shifr[0])
file.close()
def on_donkey(self): # Ключ в файл
Key = self.key.toPlainText() # Взятие текста из поля
file = open('key.txt', 'r')
lines = file.readlines()
if len(lines)==0:
lines.append(Key)
else:
lines[0] = Key
save_changes = open('key.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
def on_unkey(self): # Ключ из файла
file = open('key.txt', 'r')
KKey = file.readlines()
if len(KKey) == 0:
self.key.setPlainText('')
else:
self.key.setPlainText(KKey[0])
file.close()
def on_output1(self): # Вывод шифрованного сообщения
key = self.key.toPlainText() # Взятие ключа из поля
md = MyDES() # Создание объекта класса
forshifr = self.forshifr.toPlainText() # Взятие текста из поля
shifr = md.encode(forshifr, key) # Шифрованное сообщение
file = open('shifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(shifr)
else:
lines[0] = shifr
save_changes = open('shifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
self.label_no.setText(shifr) # Вывод на экран шифрованное сообщение
def on_output2(self): # Вывод дешифрованного сообщения
key = self.key.toPlainText()
md = MyDES()
fornoshifr = self.fornoshifr.toPlainText()
noshifr = md.decode(fornoshifr, key)
file = open('noshifr.txt', 'r')
lines = file.readlines()
if len(lines) == 0:
lines.append(noshifr)
else:
lines[0] = noshifr
file.close()
save_changes = open('noshifr.txt', 'w')
save_changes.writelines(lines)
save_changes.close()
self.label_yes.setText(noshifr)
class WindowRSA(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# тут ваша логика для WindowRSA
# ...
class StackedExample(QWidget):
def __init__(self):
super().__init__()
self.horizontalLayoutWidget = QtWidgets.QWidget()
self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.addStretch(1)
self.DES = QtWidgets.QRadioButton("DES", self.horizontalLayoutWidget)
self.DES.setObjectName("DES")
self.horizontalLayout.addWidget(self.DES)
self.RSA = QtWidgets.QRadioButton("RSA", self.horizontalLayoutWidget)
self.RSA.setObjectName("RSA")
self.horizontalLayout.addWidget(self.RSA)
self.horizontalLayout.addStretch(1)
self.DES.setChecked(True)
self.DES.toggled.connect(self.display)
self.RSA.toggled.connect(self.display)
self.stack1 = WindowDES()
self.stack2 = WindowRSA()
self.stackWidget = QStackedWidget(self)
self.stackWidget.addWidget(self.stack1)
self.stackWidget.addWidget(self.stack2)
vbox = QVBoxLayout(self)
vbox.addWidget(self.horizontalLayoutWidget)
vbox.addWidget(self.stackWidget)
self.stackWidget.setCurrentIndex(0)
def display(self):
if self.DES.isChecked():
self.stackWidget.setCurrentIndex(0)
elif self.RSA.isChecked():
self.stackWidget.setCurrentIndex(1)
if __name__ == '__main__':
app = QApplication(sys.argv)
w = StackedExample()
w.setWindowTitle('StackedWidget demo')
w.resize(670, 230)
w.show()
sys.exit(app.exec_())


