使用多个模块和Pyq时出现名称错误

2024-03-28 19:38:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用pyqt创建一个登录系统,我有多个模块,下面是我的设置模块中的部分代码:

class User(object):
        def __init__(self, fname, lname, dob, gender):
                self.firstname = fname
                self.lastname = lname
                self._dob = dob
                self.gender = gender
                self.type = 'General'
                self._username = ''
                self._hashkey = ''

        def Report(self):
                print("Full Name: {0} {1}\nDate of Birth: {2}\nGender: {3}\nAccess Level: {4}".format(self.firstname,self.lastname, self._dob, self.gender, self.type))
                print(self._username)

        def Genusername(self):
                self._username = str(str(self._dob)[:2] + self.firstname[:2] + self.lastname[:2])
                saveUsers(users)

        def Verify(self, Username, Password):
                if Password == self._hashkey:
                        return True
                else:
                        return False

def verifyUser(Username, Password):
        for user in users:
                if Username == user._username:
                        if user.Verify(Username, Password):
                                print('Login Successful')
                        else:
                                print('Wrong Password')
                else:
                        print('User does not exist')    

if __name__ == '__main__':
        users = []
        loadUsers(users)

这是我的pyqt gui模块,我正试图测试它:

from PyQt4 import QtGui, QtCore
import Settings

class Window(QtGui.QWidget):

    def __init__(self):
        super().__init__()        
        self.initUI()

    def initUI(self):

        self.lbl1 = QtGui.QLabel('Username')
        self.lbl2 = QtGui.QLabel('Password')
        self.username = QtGui.QLineEdit()
        self.password = QtGui.QLineEdit()

        self.okButton = QtGui.QPushButton("OK")
        self.okButton.clicked.connect(self.Login)
        self.cancelButton = QtGui.QPushButton("Cancel")

        grid = QtGui.QGridLayout()
        grid.setSpacing(10)

        grid.addWidget(self.lbl1, 1, 0)
        grid.addWidget(self.username, 1, 1)
        grid.addWidget(self.lbl2, 2, 0)
        grid.addWidget(self.password, 2, 1)
        grid.addWidget(self.okButton, 3, 1)
        grid.addWidget(self.cancelButton, 3, 0)

        self.setLayout(grid)

        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Login')
        self.show()

    def Login(self):
        Settings.verifyUser(self.username.text(),self.password.text())

def main():

    app = QtGui.QApplication(sys.argv)
    Loginwindow = Window()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

我试图从pyqt编辑小部件获取用户名和密码,并用用户名和密码与用户进行验证,用户都是存储在列表中的类,并作为加载的pickle文件转储,我的代码的verify函数不断出现名称错误,我不知道如何将列表放入函数,我尝试了其他方法,但不起作用,如果有其他方法来构造我的代码或使用pyqt请让我知道,我是新的pyqt和当谈到使用模块

Traceback (most recent call last):
  File "C:\Users\ProgramA\LoginGUI.py", line 39, in Login
    Settings.verifyUser(self.username.text(),self.password.text())
  File "C:\Users\ProgramA\Settings.py", line 78, in verifyUser
    for user in users:
NameError: name 'users' is not defined

Tags: 模块selfifdefusernameloginpasswordusers
2条回答

users对象在verifyUser中既不是全局对象,也不是局部对象(导入模块时,__name__不是__main__)。最好是在UI中创建它并将其作为参数传递给verifyUser

class Window(QtGui.QWidget):

    def __init__(self):
        super().__init__()        
        self.initUI()
        self.users = []

    ...

    def Login(self):
        Settings.verifyUser(self.username.text(),self.password.text(), self.users)

Settings.py中定义

def verifyUser(Username, Password, users):

您的users = []位于if __name__ == "__main__"块中,因此在导入设置时不会执行它,因此在这种情况下users将不存在。(将users作为设置模块中定义的全局变量可能没有意义。)

相关问题 更多 >