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

时间:2014-12-31 20:58:59

标签: python multithreading module pyqt pyqt4

我正在尝试使用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文件转储,我一直得到我的代码的验证功能的名称错误,我不知道如何让列表进入该功能,我尝试了其他方式,但没有工作,如果有另一种方法来构建我的代码或使用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

2 个答案:

答案 0 :(得分:1)

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):

答案 1 :(得分:0)

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