Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在类中定义属性时,Python AttributeError对象没有属性_Python_Attributes_Kivy_Attributeerror - Fatal编程技术网

在类中定义属性时,Python AttributeError对象没有属性

在类中定义属性时,Python AttributeError对象没有属性,python,attributes,kivy,attributeerror,Python,Attributes,Kivy,Attributeerror,我正在使用Kivy编写一个实用平台,供我的同事在前台使用。我无法将用户分配到会话。这是我的密码: masterControl.py from kivy.uix.boxlayout import BoxLayout class MasterControl(BoxLayout): def __init__(self, **kwargs): super(MasterControl, self).__init__(**kwargs) m_currentUser

我正在使用Kivy编写一个实用平台,供我的同事在前台使用。我无法将用户分配到会话。这是我的密码:

masterControl.py

from kivy.uix.boxlayout import BoxLayout

class MasterControl(BoxLayout):
    def __init__(self, **kwargs):
        super(MasterControl, self).__init__(**kwargs)
        m_currentUser = None

    def loginUser(self, emp):
        self.m_currentUser = emp
        print "I made it to login!"
        # remove login widget, add the rest of the UI according to the security level of the use
login.py

from kivy.uix.anchorlayout import AnchorLayout 
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.textinput import TextInput
from kivy.uix.boxlayout import BoxLayout

from coreAPI.mastercontrol import MasterControl
from employee import Employee, getEmployees

class LoginWidget(AnchorLayout):
    def __init__(self, **kwargs):
        super(LoginWidget, self).__init__(**kwargs)

        def loginBtnHandle(instance):
            empList = getEmployees()
            for emp in empList:
                if emp.m_aNum == uNameInput.text:
                    if emp.authenticate(pWordInput.text):
                        self.parent.loginUser(emp) # Here is where I get  AttributeError: 'MasterControl' object has no attribute 'loginUser'

        box = BoxLayout(orientation = 'vertical', size = (300, 110), size_hint = (None, None), spacing = 10)

        uNameInput = TextInput(hint_text = 'Username', 
                multiline = False, 
                size = (300, 30), 
                size_hint = (None, None), 
                cursor_color = [0,0,0,1], 
                write_tab = False)

        pWordInput = TextInput(hint_text = 'Password', 
                multiline = False, 
                size = (300, 30), 
                size_hint = (None, None), 
                cursor_color = [0,0,0,1], 
                password = True, 
                write_tab = False)

        loginBtn = Button(text = 'Login', size = (300, 50), size_hint = (None, None))
        loginBtn.bind(on_press = loginBtnHandle)
        loginBtn.bind(on_enter = loginBtnHandle)

        box.add_widget(uNameInput)
        box.add_widget(pWordInput)
        box.add_widget(loginBtn)

        self.add_widget(box)
employee.py

from passlib.hash import pbkdf2_sha256
import pickle
import os

class Employee():
    def __init__(self, name, aNumber, password, clearance):
        self.m_name = name
        self.m_aNum = aNumber
        self.m_pWordHash = pbkdf2_sha256.hash(password) # Only store the password hash.  NEVER the password text
        self.m_clearance = clearance

    def authenticate(self, attempt):
        return pbkdf2_sha256.verify(attempt, self.m_pWordHash)

    def serialize(self):
        filename = 'users/' + self.m_aNum + '.emp'
        frozen = pickle.dumps(self)
        f = open(filename, 'w')
        f.write(frozen)
        f.close()
        return frozen

def getEmployees():
    empList = []
    path = 'users/'
    for filename in os.listdir(path):
        f = open(path + filename, 'r')
        contents = f.read()
        empList.append(pickle.loads(contents))
    return empList

tempEmp = Employee('Tester', 'A12345678', 'password', 'HIGH')
tempEmp.serialize()
用户通过身份验证后,登录小部件调用mastercontrol的
loginUser
方法。当它执行此操作时,Python抛出AttributeError:“MasterControl”对象没有属性“loginUser”。据我所知,它应该能够调用
logiuser
。我已经完成了缩进,并排除了导致employee对象反序列化错误的原因

问题
AttributeError:“MasterControl”对象没有属性“loginUser”
是由于未实例化MasterControl类造成的

解决 有两种解决办法。第一个解决方案假设MasterControl是根小部件。第二个解决方案假设LoginWidget是根小部件。有关详细信息,请参阅代码片段和输出

解决方案1-masterControl.py
  • 从kivy.properties添加导入ObjectProperty
  • 从登录添加导入登录Widget
  • 将m_currentUser定义为ObjectProperty并将其初始化为None
  • 将LoginWidget添加到MasterControl
  • 片段 解决方案1-login.py
  • 从coreAPI.mastercontrol中删除/注释导入mastercontrol
  • 解决方案2-login.py
  • 从kivy.properties添加导入ObjectProperty
  • 定义对象属性,例如masterControl
  • 实例化类MasterControl并将其连接到新的ObjectProperty MasterControl
  • 将self.parent.login用户(emp)替换为self.masterControl.login用户(emp)
  • 片段 解决方案2-masterControl.py
  • 从kivy.properties添加导入ObjectProperty
  • 将m_currentUser定义为ObjectProperty并将其初始化为None
  • 片段 输出

    您可以发布一个,我看不到MasterControl和LoginWidget之间有任何联系,可能创建了另一个MasterControl。在您的
    MasterControl
    init方法中,将
    m\u currentUser=None
    更改为
    self.m\u currentUser=None
    from kivy.properties import ObjectProperty
    
    from login import LoginWidget
    
    
    class MasterControl(BoxLayout):
        m_currentUser = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(MasterControl, self).__init__(**kwargs)
            self.add_widget(LoginWidget())
    
    from kivy.properties import ObjectProperty
    
    
    class LoginWidget(AnchorLayout):
        masterControl = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(LoginWidget, self).__init__(**kwargs)
            self.masterControl = MasterControl()
    
            def loginBtnHandle(instance):
                empList = getEmployees()
                for emp in empList:
                    if emp.m_aNum == uNameInput.text:
                        if emp.authenticate(pWordInput.text):
                            self.masterControl.loginUser(emp)
    
    from kivy.properties import ObjectProperty
    
    
    class MasterControl(BoxLayout):
        m_currentUser = ObjectProperty(None)
    
        def __init__(self, **kwargs):
            super(MasterControl, self).__init__(**kwargs)
    
        def loginUser(self, emp):
            self.m_currentUser = emp