Search code examples
pythonqt5show-hideqtwidgets

Show and hide\close windows with user arguments using PyQt5


I am writing GUI app with the help of Qt Designer. The app consists of multiple windows, so when the user clicks the push button on one window, the next window should open and the current window should hide. I achieved this feature for going from window 1 to window 2. But I am not able to do this to move from window 2 to window 3. I think this might be because the window 2 gets user arguments.

Is there any way to hide the window which gets user arguments?

The code is as follows:

Class for main window:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
import user_data


class MainWindow(object):

    def user_data(self):
        self.user_data_window = QtWidgets.QMainWindow()
        self.next_window = user_data.Ui_UserData()
        self.next_window.setupUi(self.user_data_window)
        main_window.hide()
        self.user_data_window.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(140, 100, 361, 81))
        font = QtGui.QFont()
        font.setPointSize(24)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(260, 260, 75, 51))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.user_data)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 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", "Main Window"))
        self.label.setText(_translate("MainWindow", " Manager"))
        self.pushButton.setText(_translate("MainWindow", "Lets Start!"))


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    main_window = QtWidgets.QMainWindow()
    ui = MainWindow()
    ui.setupUi(main_window)
    main_window.show()
    sys.exit(app.exec_())

user_data.py ---> window 2

from PyQt5 import QtCore, QtGui, QtWidgets
import start_recording
class Ui_UserData(object):

    def start_record(self):
        self.window = QtWidgets.QMainWindow()
        self.ui = start_recording.Ui_StartRecording()
        self.ui.setupUi(self.window) 
        """
        This is the part not working
        """ 
        MainWindow.hide()
        self.window.show()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.groupBox_speaker_data = QtWidgets.QGroupBox(self.centralwidget)
        self.groupBox_speaker_data.setGeometry(QtCore.QRect(80, 30, 481, 381))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(84)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        self.groupBox_speaker_data.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.groupBox_speaker_data.setFont(font)
        self.groupBox_speaker_data.setObjectName("groupBox_speaker_data")
        self.label_name = QtWidgets.QLabel(self.groupBox_speaker_data)
        self.label_name.setGeometry(QtCore.QRect(30, 60, 47, 13))
        self.label_name.setObjectName("label_name")
        self.label_age = QtWidgets.QLabel(self.groupBox_speaker_data)
        self.label_age.setGeometry(QtCore.QRect(30, 120, 47, 13))
        self.label_age.setObjectName("label_age")
        self.label_id = QtWidgets.QLabel(self.groupBox_speaker_data)
        self.label_id.setGeometry(QtCore.QRect(30, 90, 47, 13))
        self.label_id.setObjectName("label_id")
        self.label_gender = QtWidgets.QLabel(self.groupBox_speaker_data)
        self.label_gender.setGeometry(QtCore.QRect(30, 150, 47, 13))
        self.label_gender.setObjectName("label_gender")
        self.lineEdit_name = QtWidgets.QLineEdit(self.groupBox_speaker_data)
        self.lineEdit_name.setGeometry(QtCore.QRect(110, 60, 141, 20))
        self.lineEdit_name.setObjectName("lineEdit_name")
        self.lineEdit_id = QtWidgets.QLineEdit(self.groupBox_speaker_data)
        self.lineEdit_id.setGeometry(QtCore.QRect(110, 90, 141, 20))
        self.lineEdit_id.setObjectName("lineEdit_id")
        self.spinBox_age = QtWidgets.QSpinBox(self.groupBox_speaker_data)
        self.spinBox_age.setGeometry(QtCore.QRect(110, 120, 42, 22))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(18)
        sizePolicy.setVerticalStretch(78)
        self.spinBox_age.setSizePolicy(sizePolicy)
        self.spinBox_age.setMinimum(18)
        self.spinBox_age.setObjectName("spinBox_age")
        self.comboBox_gender = QtWidgets.QComboBox(self.groupBox_speaker_data)
        self.comboBox_gender.setGeometry(QtCore.QRect(110, 150, 69, 22))
        self.comboBox_gender.setObjectName("comboBox_gender")
        self.comboBox_gender.addItem("")
        self.comboBox_gender.addItem("")
        self.comboBox_gender.addItem("")
        self.pushButton = QtWidgets.QPushButton(self.groupBox_speaker_data)
        self.pushButton.setGeometry(QtCore.QRect(370, 330, 75, 23))
        self.pushButton.setObjectName("pushButton")

        self.pushButton.clicked.connect(self.start_record)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 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", "User Data"))
        self.groupBox_speaker_data.setTitle(_translate("MainWindow", "Speaker Data"))
        self.label_name.setText(_translate("MainWindow", "Name:"))
        self.label_age.setText(_translate("MainWindow", "Age:"))
        self.label_id.setText(_translate("MainWindow", "ID:"))
        self.label_gender.setText(_translate("MainWindow", "Gender:"))
        self.comboBox_gender.setItemText(0, _translate("MainWindow", "Male"))
        self.comboBox_gender.setItemText(1, _translate("MainWindow", "Female"))
        self.comboBox_gender.setItemText(2, _translate("MainWindow", "Unknown"))
        self.pushButton.setText(_translate("MainWindow", "NEXT"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_UserData()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

start_recording.py ----> window 3

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_StartRecording(object):

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(160, 120, 331, 91))
        font = QtGui.QFont()
        font.setFamily("Arial Black")
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(260, 200, 101, 51))
        font = QtGui.QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(260, 260, 75, 23))
        self.pushButton.setObjectName("pushButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 640, 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", "Lets begin"))
        self.label_2.setText(_translate("MainWindow", "xxx!"))
        self.pushButton.setText(_translate("MainWindow", "PushButton"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_StartRecording()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Solution

  • class Ui_UserData(object):
    
        def start_record(self):
            self.window = QtWidgets.QMainWindow()
            self.ui = start_recording.Ui_StartRecording()
            self.ui.setupUi(self.window) 
            """
           This is the part not working
           """ 
           MainWindow.hide()
           ^^^^^^^^ ---- there is no 'MainWindow' variable available to class, hence it doesn't know what to hide here.
    

    Solution is:

    class Ui_UserData(object):
        def start_record(self):
            self.window = QtWidgets.QMainWindow()
            self.ui = start_recording.Ui_StartRecording()
            self.ui.setupUi(self.window)
            """
            This part is now working!
            """
            self.mw.hide()
            self.window.show()
    
        def setupUi(self, MainWindow):
            self.mw = MainWindow
            # ^^^^^^^^ - You create class variable for mainwindow object