how can i connect three different screen depending on logged user status?

Viewed 102

I am just stuck in first issue. after successful log-in, then it should switched into main screen depending on admin, staff, and visitor. (these three have different screen).

I just see some tutorial and made this. i am able to pop up different screens depending on usertype, but since i just connected to the new py file, it keeps make additional screen above previous one. I need to close previous one and pop new one.

this is the login file. since signup seems work correctly, i will not attach it here. and i have three files that is staff, admin, visitor. as an example, i will attach only staff.py here. if issues solve, I can handle other switch screen function. please help me to change into staff screen when logged user has 'staff' usertype.

enter image description here

enter image description here

login.py

import pymysql
from PyQt5 import QtCore, QtGui, QtWidgets
from sign import Ui_SignUp
from admin import Ui_adminWindow
from visitor import Ui_visitorWindow
from staff import Ui_staffWindow

class Ui_loginWindow(object):
    def changeToAdminScreen(self):
        self.adminWindow = QtWidgets.QMainWindow()
        self.ui = Ui_adminMainWindow();
        self.ui.setupUi(self.adminWindow)
        self.adminWindow.show()
        self.close()
    def changeToVisitorScreen(self):
        self.visitorWindow = QtWidgets.QMainWindow()
        self.ui = Ui_visitorMainWindow();
        self.ui.setupUi(self.visitorWindow)
        self.visitorWindow.show()
    def changeToStaffScreen(self):
        self.staffWindow = QtWidgets.QMainWindow()
        self.ui = Ui_staffWindow();
        self.ui.setupUi(self.staffWindow)
        # self.connect(self.staffWindow)
        self.staffWindow.show()
    def changeToSignUpScreen(self):
        self.signUpWindow = QtWidgets.QDialog()
        self.ui = Ui_SignUp();
        self.ui.setupUi(self.signUpWindow)
        self.signUpWindow.show()
    def successWindowShow(self, usertype):
        if(usertype == 'staff'):
            self.changeToStaffScreen()
        if (usertype == 'admin'):
            self.changeToAdminScreen()
        if(usertype == 'visitor'):
            self.changeToVisitorScreen()

    def failedMessage(self, title, message):
        msgBox = QtWidgets.QMessageBox()
        msgBox.setIcon(QtWidgets.QMessageBox.Warning)
        msgBox.setWindowTitle(title)
        msgBox.setText(message)
        msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
        msgBox.exec_()
    def loginCheck(self):
        email = self.log_email_line.text()
        password = self.log_pass_line.text()
        connection = pymysql.connect(host ='127.0.0.1', port = 3306, user = 'root',password='mr1035122')
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM ZOO.USER AS USER WHERE USER.Email = %s AND User.Password = %s", (email, password))
        result = cursor.fetchall()
        if(len(result) > 0):
            print("login success! Welcome to the atlanta zoo")
            cursor.execute("SELECT UserType From zoo.User")
            self.successWindowShow(cursor.fetchone()[0])
        else:
            print("incorrect email or password. Please check whether you entered correctly. or if you are new user, please sign up")
            msg ="incorrect email or password. Please check whether you entered correctly. or if you are new user, please sign up"
            self.failedMessage("failed login", msg)
        connection.close()
    def signUpCheck(self):
        self.changeToSignUpScreen()
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setStyleSheet("background:rgb(237, 212, 0)")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem, 1, 0, 1, 1)
        spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem1, 6, 2, 1, 1)
        self.log_email_line = QtWidgets.QLineEdit(self.centralwidget)
        self.log_email_line.setStyleSheet("background:rgb(238, 238, 236)")
        self.log_email_line.setObjectName("log_email_line")
        self.gridLayout.addWidget(self.log_email_line, 2, 2, 1, 1)
        self.login_button = QtWidgets.QPushButton(self.centralwidget)
        self.login_button.setStyleSheet("background:rgb(186, 189, 182)")
        self.login_button.setObjectName("login_button")
        #######################login_button event########################
        self.login_button.clicked.connect(self.loginCheck)
        #################################################################
        self.gridLayout.addWidget(self.login_button, 4, 2, 1, 1)
        self.email_label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(13)
        font.setBold(True)
        font.setWeight(75)
        self.email_label.setFont(font)
        self.email_label.setAlignment(QtCore.Qt.AlignCenter)
        self.email_label.setObjectName("email_label")
        self.gridLayout.addWidget(self.email_label, 2, 1, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem2, 0, 2, 1, 1)
        self.log_pass_line = QtWidgets.QLineEdit(self.centralwidget)
        self.log_pass_line.setStyleSheet("background:rgb(238, 238, 236)")
        self.log_pass_line.setObjectName("log_pass_line")
        self.gridLayout.addWidget(self.log_pass_line, 3, 2, 1, 1)
        self.password_label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(13)
        font.setBold(True)
        font.setWeight(75)
        self.password_label.setFont(font)
        self.password_label.setAlignment(QtCore.Qt.AlignCenter)
        self.password_label.setObjectName("password_label")
        self.gridLayout.addWidget(self.password_label, 3, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem3, 1, 3, 1, 1)
        self.signup_button = QtWidgets.QPushButton(self.centralwidget)
        self.signup_button.setStyleSheet("background:rgb(186, 189, 182)")
        self.signup_button.setObjectName("signup_button")
        #######################signup_button event########################
        self.signup_button.clicked.connect(self.signUpCheck)
        ################################################################
        self.gridLayout.addWidget(self.signup_button, 5, 2, 1, 1)
        self.title_label = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.title_label.setFont(font)
        self.title_label.setAlignment(QtCore.Qt.AlignCenter)
        self.title_label.setObjectName("title_label")
        self.gridLayout.addWidget(self.title_label, 1, 1, 1, 2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        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.login_button.setText(_translate("MainWindow", "Login"))
        self.email_label.setText(_translate("MainWindow", "Email"))
        self.password_label.setText(_translate("MainWindow", "password"))
        self.signup_button.setText(_translate("MainWindow", "Sign Up"))
        self.title_label.setText(_translate("MainWindow", "Welcome to Atlanta Zoo"))

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

staff.py

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_staffWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        MainWindow.setStyleSheet("background:rgb(237, 212, 0)")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout.setObjectName("gridLayout")
        self.logOut = QtWidgets.QPushButton(self.centralwidget)
        self.logOut.setStyleSheet("background:rgb(186, 189, 182)")
        self.logOut.setObjectName("logOut")
        self.gridLayout.addWidget(self.logOut, 4, 1, 1, 1)
        self.searchAnimals = QtWidgets.QPushButton(self.centralwidget)
        self.searchAnimals.setStyleSheet("background:rgb(186, 189, 182)")
        self.searchAnimals.setObjectName("searchAnimals")
        self.gridLayout.addWidget(self.searchAnimals, 2, 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, 4, 2, 1, 1)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.gridLayout.addItem(spacerItem2, 4, 0, 1, 1)
        self.viewShowsHistory = QtWidgets.QPushButton(self.centralwidget)
        self.viewShowsHistory.setStyleSheet("background:rgb(186, 189, 182)")
        self.viewShowsHistory.setObjectName("viewShowsHistory")
        self.gridLayout.addWidget(self.viewShowsHistory, 3, 1, 1, 1)
        self.title_label_2 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(16)
        self.title_label_2.setFont(font)
        self.title_label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.title_label_2.setObjectName("title_label_2")
        self.gridLayout.addWidget(self.title_label_2, 1, 1, 1, 1)
        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.gridLayout.addItem(spacerItem3, 5, 1, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        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.logOut.setText(_translate("MainWindow", "Log out"))
        self.searchAnimals.setText(_translate("MainWindow", "Search for Animals"))
        self.viewShowsHistory.setText(_translate("MainWindow", "View Shows"))
        self.title_label_2.setText(_translate("MainWindow", "Welcome to Atlanta Zoo"))

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

First of all I recommend you read the official documentation about the use of Qt Designer, it indicates that you should not modify the .py generated by pyuic but create another class that uses the design and inherits the correct widget.

And why do I recommend that PyQt?

Because the class generated by Qt Designer is not a widget and it will not have the widgets methods like close().


This is precisely because the window is not closed.

So the solution is that you restore login.py or you regenerate it again (the latter is the simplest thing), and you create a main.py where the classes are and there we will implement the logic:

main.py

import pymysql
from PyQt5 import QtCore, QtGui, QtWidgets

from login import Ui_loginWindow
from sign import Ui_SignUp
from admin import Ui_adminWindow
from visitor import Ui_visitorWindow
from staff import Ui_staffWindow


class SignUp(QtWidgets.QDialog, Ui_SignUp):
    def __init__(self, parent=None):
        super(SignUp, self).__init__(parent)
        self.setupUi(self)

class StaffWindow(QtWidgets.QMainWindow, Ui_staffWindow):
    def __init__(self, parent=None):
        super(StaffWindow, self).__init__(parent)
        self.setupUi(self)

class AdminWindow(QtWidgets.QMainWindow, Ui_adminWindow):
    def __init__(self, parent=None):
        super(AdminWindow, self).__init__(parent)
        self.setupUi(self)

class VisitorWindow(QtWidgets.QMainWindow, Ui_visitorWindow):
    def __init__(self, parent=None):
        super(VisitorWindow, self).__init__(parent)
        self.setupUi(self)

class LoginWindow(QtWidgets.QMainWindow, Ui_loginWindow):
    def __init__(self, parent=None):
        super(LoginWindow, self).__init__(parent)
        self.setupUi(self)
        #######################login_button event########################
        self.login_button.clicked.connect(self.loginCheck)
        #################################################################
        #######################signup_button event#######################
        self.signup_button.clicked.connect(self.signUpCheck)
        #################################################################

    def changeToAdminScreen(self):
        self.adminWindow = AdminWindow()
        self.adminWindow.show()
        self.close()

    def changeToVisitorScreen(self):
        self.visitorWindow = VisitorWindow()
        self.visitorWindow.show()
        self.close()

    def changeToStaffScreen(self):
        self.staffWindow = StaffWindow()
        self.staffWindow.show()
        self.close()

    def changeToSignUpScreen(self):
        self.signUpWindow = SignUp()
        self.signUpWindow.show()

    def successWindowShow(self, usertype):
        if usertype == 'staff':
            self.changeToStaffScreen()
        elif usertype == 'admin':
            self.changeToAdminScreen()
        elif usertype == 'visitor':
            self.changeToVisitorScreen()

    def failedMessage(self, title, message):
        msgBox = QtWidgets.QMessageBox()
        msgBox.setIcon(QtWidgets.QMessageBox.Warning)
        msgBox.setWindowTitle(title)
        msgBox.setText(message)
        msgBox.setStandardButtons(QtWidgets.QMessageBox.Ok)
        msgBox.exec_()

    @QtCore.pyqtSlot()
    def loginCheck(self):
        email = self.log_email_line.text()
        password = self.log_pass_line.text()
        connection = pymysql.connect(host ='127.0.0.1', port = 3306, user = 'root',password='mr1035122')
        cursor = connection.cursor()
        cursor.execute("SELECT * FROM ZOO.USER AS USER WHERE USER.Email = %s AND User.Password = %s", (email, password))
        result = cursor.fetchall()
        if (len(result) > 0):
            print("login success! Welcome to the atlanta zoo")
            cursor.execute("SELECT UserType From zoo.User")
            self.successWindowShow(cursor.fetchone()[0])
        else:
            print("incorrect email or password. Please check whether you entered correctly. or if you are new user, please sign up")
            msg ="incorrect email or password. Please check whether you entered correctly. or if you are new user, please sign up"
            self.failedMessage("failed login", msg)
        connection.close()

    @QtCore.pyqtSlot()
    def signUpCheck(self):
        self.changeToSignUpScreen()


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = LoginWindow()
    w.show()
    sys.exit(app.exec_())
Related