Search code examples
pythonkivykivy-language

AttributeError: 'NoneType' object has no attribute 'text' kivy


I'm trying to extract the values from the text box present in the ABC.kvfile. I found a similar question at this url. And I tried applying the same solution, but the error keeps popping up. I have no idea where the root of the problem lies. Can somebody be kind enough to shed some light on the problem I'm facing.

ABC.py

    from kivy.app import App
from kivy.lang import Builder
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty
from kivy.uix.popup import Popup
from kivy.uix.screenmanager import ScreenManager, Screen, FadeTransition

class LoginScreen(BoxLayout):
    username_input = ObjectProperty()
    passwd_input = ObjectProperty()

    def __init__(self, **kwargs):
        super(LoginScreen, self).__init__(**kwargs)


        boxp = BoxLayout(orientation='vertical')
        labs = Label(text='')
        self.boxp = BoxLayout(orientation='vertical')
        self.labs = Label(text='')
        self.boxp.add_widget(self.labs)

        self.box = BoxLayout()
        self.box.orientation = 'horizontal'
        btn5 = Button(text="ok", size_hint=(0.5, 0.5))
        btn5.bind(on_release=self.checkin())
        self.box.add_widget(btn5)
        self.box.add_widget(Button(text='cancel', size_hint=(0.5, 0.5), on_release=self.cancel_button_hit))
        self.boxp.add_widget(self.box)
        self.popup = Popup(title="LOGIN SUCCESSFUL",
                            content=self.boxp,
                            size=(200, 200),
                            size_hint=(0.3, 0.3),
                            auto_dismiss=True)

    def checkin(self):
        if self.username_input.text=="root" and self.passwd_input.text=="root":
            self.labs.text = self.username_input.text
            self.popup.open()

        else:
            self.popup.title='Failed Login'
            self.labs.text = 'Failed'
            self.popup.open()
    def cancel_button_hit(self, instance):
        self.popup.dismiss()

class AnotherScreen(Screen):
    pass

class ScreenManagement(ScreenManager):
    pass

class MainApp(App):
    def build(self):
        return LoginScreen()

MainApp().run()

ABC.kv

#: import FadeTransition kivy.uix.screenmanager.FadeTransition
ScreenManagement:
    transition: FadeTransition()
    LoginScreen:
    AnotherScreen:

<LoginScreen>:
    orientation: "vertical"
    username_input: username
    passwd_input: passwd
    padding: 10
    spacing: 10
    name: 'login'
    BoxLayout:
        orientation: "vertical"
        Label:
            text: "Username"

        TextInput:
            id: username

        Label:
            text: "password"

        TextInput:
            id: passwd
            password: True

        Button:
            on_release: root.checkin()
            text: 'login'
            font_size: 50

<AnotherScreen>:
    name: 'other'

    Button:
        on_release: app.root.current = 'main'
        text: 'back to the home screen'
        font_size: 50

Traceback:

Traceback (most recent call last):
   File "C:/Users/Admin/PycharmProjects/guihm/ABC.py", line 59, in <module>
     MainApp().run()
   File "C:\Python34\lib\site-packages\kivy\app.py", line 802, in run
     root = self.build()
   File "C:/Users/Admin/PycharmProjects/guihm/ABC.py", line 57, in build
     return LoginScreen()
   File "C:/Users/Admin/PycharmProjects/guihm/ABC.py", line 27, in __init__
     btn5.bind(on_release=self.checkin())
   File "C:/Users/Admin/PycharmProjects/guihm/ABC.py", line 38, in checkin
     if self.username_input.text=="root" and self.passwd_input.text=="root":
 AttributeError: 'NoneType' object has no attribute 'text'

Solution

  • When the user clicks on btn5 in the popup there's no point of calling the checkin method again. You've already called it in the definition of the login button present in the ABC.kv file. First, remove the parenthesis after checkin from the line btn5.bind(on_release=self.checkin()). I'd suggest calling a different method to handle the on_release action of btn5.

    btn5.bind(on_release=self.success)
    

    define a method called success

    def success(self,instance):
        self.popup1.dismiss()   
    

    Also enclose the ScreenManagement class in the .kv file within angular braces.