Python 如何根据记录的用户状态连接三个不同的屏幕?

Python 如何根据记录的用户状态连接三个不同的屏幕?,python,pyqt,pyqt5,qt-designer,Python,Pyqt,Pyqt5,Qt Designer,我只是被困在第一期。成功登录后,应根据管理员、工作人员和访问者切换到主屏幕。(这三个有不同的屏幕) 我只是看了一些教程,做了这个。我可以根据用户类型弹出不同的屏幕,但因为我刚刚连接到新的py文件,所以它会在上一个屏幕的基础上增加额外的屏幕。我需要关闭前一个并弹出新的 这是登录文件。既然注册似乎是正确的,我就不把它附在这里了。我有三个文件,职员,管理员,访客。例如,我将仅在此处附加staff.py。如果问题解决,我可以处理其他开关屏幕功能。当登录用户具有“staff”用户类型时,请帮助我切换到st

我只是被困在第一期。成功登录后,应根据管理员、工作人员和访问者切换到主屏幕。(这三个有不同的屏幕)

我只是看了一些教程,做了这个。我可以根据用户类型弹出不同的屏幕,但因为我刚刚连接到新的py文件,所以它会在上一个屏幕的基础上增加额外的屏幕。我需要关闭前一个并弹出新的

这是登录文件。既然注册似乎是正确的,我就不把它附在这里了。我有三个文件,职员,管理员,访客。例如,我将仅在此处附加staff.py。如果问题解决,我可以处理其他开关屏幕功能。当登录用户具有“staff”用户类型时,请帮助我切换到staff屏幕

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_())

首先,我建议您阅读关于Qt Designer使用的文章,它指出您不应该修改pyuic生成的.py,而应该创建另一个使用该设计并继承正确小部件的类

我为什么推荐PyQt?

因为Qt设计器生成的类不是一个小部件,它不会有像
close()
这样的小部件方法


这正是因为窗户没有关上

因此,解决方案是恢复login.py或重新生成它(后者是最简单的事情),然后在类所在的位置创建main.py,我们将在那里实现逻辑:

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_())

我很抱歉。我是新的这个网站以及编程。基本上,当你看到我附加的第二张图片时,它会不断添加额外的屏幕,我绝对不想要它。当我在谷歌上搜索的时候,我看到人们推荐这个节目并关闭了上一个。但我不知道怎么做。我在changeToStaffScreen(self)中尝试了self.close()。但它不起作用…还是看看好吗?我删除了一些无用的代码。这太棒了!我确实学习了很多。希望能像你一样!非常感谢你。。即使我有更多的事情要做:(我能问一个很快的问题吗?实际上,这个应用程序包括了将近40页。我想我会很接近并且显示出方法,因为对于像我这样的超级初学者来说它其实更容易。但是我有一个前一个屏幕的后退按钮,当我考虑这一点时,将HID()代替Couter()。会是更好的选择吗??