Как переходить между виджетами pyqt5. Передача информации из первого скрытого виджета в другой показуемый
Помогите реализовать. Есть главное окно, на котором студент должен будет вбивать ФИО, группу и номер по списку.
Как мне передавать номер по списку в следующий виджет, после нажатия на кнопку "Далее"(зеленая кнопка)? и как возвращаться обратно к первому виджету при нажатии кнопки "Назад"(зеленая кнопка).
И вообще правильно ли я делаю, что скрываю центральный виджет, может есть какая-то более корректная альтернатива?
main
from PyQt5 import QtWidgets, QtGui, QtCore
from first_try import Ui_MainWindow
from second_try import Ui_Form
import sys
class Widget(QtWidgets.QWidget):
def __init__(self):
super(Widget, self).__init__()
self.ui = Ui_Form()
self.ui.setupUi(self)
self.ui.pushButton.setText('Назад')
self.ui.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
class Start_Window(QtWidgets.QMainWindow):
def __init__(self):
super(Start_Window, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.setWindowTitle('Лабораторная работа №1')
self.ui.lineEdit_6.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.ui.lineEdit_6.setPlaceholderText('Введите группу: ТФ-ХХ-ХХ')
self.ui.lineEdit_6.setMaxLength(9)
self.ui.lineEdit_4.setPlaceholderText('Введите ФИО:')
self.ui.lineEdit_4.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.ui.lineEdit_5.setStyleSheet("background-color: rgb(170, 170, 255);")
self.ui.comboBox.setStyleSheet("background-color: rgb(170, 170, 255);")
self.ui.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.ui.pushButton.setToolTip('<b>Продолжить<b>')
self.ui.pushButton.clicked.connect(self.hide_widget)
def hide_widget(self):
# self.ui.lineEdit_6.setText(self.ui.comboBox.currentText())
self.ui.centralwidget.hide()
self.setCentralWidget(Widget())
app = QtWidgets.QApplication([])
application = Start_Window()
application.show()
app.setStyle('Fusion')
sys.exit(app.exec())
first_try
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(938, 514)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.frame = QtWidgets.QFrame(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
self.frame.setSizePolicy(sizePolicy)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.frame)
self.label.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(14)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label.setFont(font)
self.label.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
self.label.setLayoutDirection(QtCore.Qt.RightToLeft)
self.label.setAutoFillBackground(False)
self.label.setTextFormat(QtCore.Qt.AutoText)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.lineEdit_6 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_6.setObjectName("lineEdit_6")
self.verticalLayout.addWidget(self.lineEdit_6)
self.lineEdit_4 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_4.setObjectName("lineEdit_4")
self.verticalLayout.addWidget(self.lineEdit_4)
self.label_2 = QtWidgets.QLabel(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt")
font.setPointSize(12)
self.label_2.setFont(font)
self.label_2.setTextFormat(QtCore.Qt.PlainText)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.comboBox = QtWidgets.QComboBox(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
self.comboBox.setFont(font)
self.comboBox.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
self.comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLengthWithIcon)
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.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.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.comboBox.addItem("")
self.comboBox.addItem("")
self.verticalLayout.addWidget(self.comboBox)
self.pushButton = QtWidgets.QPushButton(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
self.pushButton.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.verticalLayout_2.addWidget(self.frame)
MainWindow.setCentralWidget(self.centralwidget)
self.action123 = QtWidgets.QAction(MainWindow)
self.action123.setObjectName("action123")
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(self.lineEdit_6.clear)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ЛАБОРАТОРНАЯ РАБОТА №1"))
self.label_2.setText(_translate("MainWindow", "Выберите номер варианта по списку"))
self.comboBox.setItemText(0, _translate("MainWindow", "1"))
self.comboBox.setItemText(1, _translate("MainWindow", "2"))
self.comboBox.setItemText(2, _translate("MainWindow", "3"))
self.comboBox.setItemText(3, _translate("MainWindow", "4"))
self.comboBox.setItemText(4, _translate("MainWindow", "5"))
self.comboBox.setItemText(5, _translate("MainWindow", "6"))
self.comboBox.setItemText(6, _translate("MainWindow", "7"))
self.comboBox.setItemText(7, _translate("MainWindow", "8"))
self.comboBox.setItemText(8, _translate("MainWindow", "9"))
self.comboBox.setItemText(9, _translate("MainWindow", "10"))
self.comboBox.setItemText(10, _translate("MainWindow", "11"))
self.comboBox.setItemText(11, _translate("MainWindow", "12"))
self.comboBox.setItemText(12, _translate("MainWindow", "13"))
self.comboBox.setItemText(13, _translate("MainWindow", "14"))
self.comboBox.setItemText(14, _translate("MainWindow", "15"))
self.comboBox.setItemText(15, _translate("MainWindow", "16"))
self.comboBox.setItemText(16, _translate("MainWindow", "17"))
self.comboBox.setItemText(17, _translate("MainWindow", "18"))
self.comboBox.setItemText(18, _translate("MainWindow", "19"))
self.comboBox.setItemText(19, _translate("MainWindow", "20"))
self.comboBox.setItemText(20, _translate("MainWindow", "21"))
self.comboBox.setItemText(21, _translate("MainWindow", "22"))
self.comboBox.setItemText(22, _translate("MainWindow", "23"))
self.comboBox.setItemText(23, _translate("MainWindow", "24"))
self.comboBox.setItemText(24, _translate("MainWindow", "25"))
self.comboBox.setItemText(25, _translate("MainWindow", "26"))
self.comboBox.setItemText(26, _translate("MainWindow", "27"))
self.comboBox.setItemText(27, _translate("MainWindow", "28"))
self.comboBox.setItemText(28, _translate("MainWindow", "29"))
self.comboBox.setItemText(29, _translate("MainWindow", "30"))
self.comboBox.setItemText(30, _translate("MainWindow", "31"))
self.comboBox.setItemText(31, _translate("MainWindow", "32"))
self.comboBox.setItemText(32, _translate("MainWindow", "33"))
self.comboBox.setItemText(33, _translate("MainWindow", "34"))
self.comboBox.setItemText(34, _translate("MainWindow", "35"))
self.pushButton.setText(_translate("MainWindow", "Далее"))
self.action123.setText(_translate("MainWindow", "123"))
second_try
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(560, 473)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setObjectName("verticalLayout")
self.textEdit = QtWidgets.QTextEdit(Form)
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "PushButton"))
Ответы (1 шт):
Пожалуйста всегда публикуйте все необходимые модули для воспроизведения вашего приложения.
Вариант того что вы хотите сделать, может выглядеть так:
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from first_try import Ui_MainWindow
from second_try import Ui_Form
class Widget(QtWidgets.QWidget, Ui_Form):
def __init__(self, text, parent):
super(Widget, self).__init__()
self.setupUi(self)
self.parent = parent
self.label.setText(f'{self.label.text()} <b style="color: red;">{text}</b>')
self.pushButton.setText('Назад')
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.clicked.connect(self.on_button_second)
def on_button_second(self):
self.parent.show()
self.hide()
class Start_Window(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Start_Window, self).__init__()
self.setupUi(self)
self.setWindowTitle('Лабораторная работа №1')
self.lineEditGrup.setStyleSheet("font: 10pt \"HouschkaRoundedAlt 9\";")
self.lineEditGrup.setMaxLength(9)
self.lineEditFio.setStyleSheet("font: 10pt \"HouschkaRoundedAlt 9\";")
self.comboBox.setStyleSheet("background-color: rgb(170, 170, 255);")
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.setToolTip('<b>Продолжить<b>')
self.pushButton.clicked.connect(self.hide_widget)
def hide_widget(self):
self.widget = Widget(self.comboBox.currentText(), self)
self.widget.show()
self.hide()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
application = Start_Window()
application.show()
sys.exit(app.exec_())
first_try.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(675, 482)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setMinimumSize(QtCore.QSize(240, 300))
self.frame.setMaximumSize(QtCore.QSize(240, 300))
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.labelTitle = QtWidgets.QLabel(self.frame)
self.labelTitle.setGeometry(QtCore.QRect(30, 20, 191, 31))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.labelTitle.setFont(font)
self.labelTitle.setObjectName("labelTitle")
self.lineEditGrup = QtWidgets.QLineEdit(self.frame)
self.lineEditGrup.setGeometry(QtCore.QRect(30, 80, 171, 20))
self.lineEditGrup.setObjectName("lineEditGrup")
self.lineEditFio = QtWidgets.QLineEdit(self.frame)
self.lineEditFio.setGeometry(QtCore.QRect(30, 110, 171, 20))
self.lineEditFio.setObjectName("lineEditFio")
self.labelCombo = QtWidgets.QLabel(self.frame)
self.labelCombo.setGeometry(QtCore.QRect(16, 150, 211, 20))
font = QtGui.QFont()
font.setPointSize(8)
self.labelCombo.setFont(font)
self.labelCombo.setObjectName("labelCombo")
self.comboBox = QtWidgets.QComboBox(self.frame)
self.comboBox.setGeometry(QtCore.QRect(38, 180, 161, 21))
font = QtGui.QFont()
font.setPointSize(10)
font.setBold(True)
font.setWeight(75)
self.comboBox.setFont(font)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.pushButton = QtWidgets.QPushButton(self.frame)
self.pushButton.setGeometry(QtCore.QRect(80, 220, 75, 23))
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.frame)
self.gridLayout.addLayout(self.verticalLayout, 1, 1, 1, 1)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem, 0, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem1, 1, 2, 1, 1)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout.addItem(spacerItem2, 1, 0, 1, 1)
spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout.addItem(spacerItem3, 2, 1, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 675, 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.labelTitle.setText(_translate("MainWindow", "Лабораторная работа № 1"))
self.lineEditGrup.setPlaceholderText(_translate("MainWindow", "Введите группу: ТФ-ХХ-ХХ"))
self.lineEditFio.setPlaceholderText(_translate("MainWindow", "Введите ФИО:"))
self.labelCombo.setText(_translate("MainWindow", "Выберите номер варианта по списку"))
self.comboBox.setCurrentText(_translate("MainWindow", "21"))
self.comboBox.setItemText(0, _translate("MainWindow", "1"))
self.comboBox.setItemText(1, _translate("MainWindow", "2"))
self.comboBox.setItemText(2, _translate("MainWindow", "3"))
self.comboBox.setItemText(3, _translate("MainWindow", "21"))
self.comboBox.setItemText(4, _translate("MainWindow", "22"))
self.pushButton.setText(_translate("MainWindow", "Далее"))
second_try.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(675, 391)
self.gridLayout = QtWidgets.QGridLayout(Form)
self.gridLayout.setObjectName("gridLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setObjectName("verticalLayout")
self.frame = QtWidgets.QFrame(Form)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.label = QtWidgets.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(10, 10, 311, 16))
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.frame)
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label.setText(_translate("Form", "здесь должно быть написано:"))
self.pushButton.setText(_translate("Form", "PushButton"))
Update
хотел бы узнать можно ли как-нибудь открывать второй виджет не в отдельном окне, как у вас, а в этом же окне программы (просто скрывая основной и показывая другой, и наоборот)?
Все можно, но другой вопрос насколько это нужно. Обратите внимание, что в этом примере используются приведенные ваши модули first_try.py и second_try.py.
main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from first_try import Ui_MainWindow
from second_try import Ui_Form
class Widget(QtWidgets.QWidget, Ui_Form):
def __init__(self, text, parent):
super(Widget, self).__init__(parent) # + parent
self.setupUi(self)
self.parent = parent
self.textEdit.setText(text)
self.pushButton.setText('Назад')
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.clicked.connect(self.on_button_second)
def on_button_second(self):
self.close() # +
self.parent.frame.show() # +
class Start_Window(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Start_Window, self).__init__()
self.setupUi(self)
self.setWindowTitle('Лабораторная работа №1')
self.lineEdit_6.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.lineEdit_6.setPlaceholderText('Введите группу: ТФ-ХХ-ХХ')
self.lineEdit_6.setMaxLength(9)
self.lineEdit_4.setPlaceholderText('Введите ФИО:')
self.lineEdit_4.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
# ??? self.lineEdit_5.setStyleSheet("background-color: rgb(170, 170, 255);") # ???
self.comboBox.setStyleSheet("background-color: rgb(170, 170, 255);")
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.setToolTip('<b>Продолжить<b>')
self.pushButton.clicked.connect(self.hide_widget)
def hide_widget(self):
self.widget = Widget(self.comboBox.currentText(), self)
self.frame.hide() # +
self.verticalLayout_2.addWidget(self.widget) # +
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
app.setStyle('Fusion')
application = Start_Window()
application.show()
sys.exit(app.exec_())




