Search code examples
pythonkivykivy-language

AttributeError: 'NoneType' object has no attribute 'text' in python


I am using python-2.7 and kivy.When i run test.py then it gives error AttributeError: 'NoneType' object has no attribute 'text' in python?
Someone tell me what is mistake?

test.py

import kivy

kivy.require('1.9.0')  # replace with your current kivy version !
from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.properties import ObjectProperty


Window.size = (500, 230)


class GroupScreen(Screen):
    groupName = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(GroupScreen, self).__init__(**kwargs)
        self.groupName.text = "Test"


class Group(App):

    def build(self):
        self.root = Builder.load_file('test.kv')
        return self.root



if __name__ == '__main__':
    Group().run()

test.kv

GroupScreen:
    groupName:groupName

    GridLayout:
        cols: 2
        padding : 30,30
        spacing: 10, 10
        row_default_height: '40dp'

        Label:
            text: 'Test'

        SingleLineTextInput:
            id: groupName

        GreenButton:
            text: 'Ok'

        GreenButton:
            text: 'Cancel'

        Label:

        Label:



<SingleLineTextInput@TextInput>:
    multiline: False


<GreenButton@Button>:
    background_color: 1, 1, 1, 1
    size_hint_y: None
    height: self.parent.height * 0.150

Solution

  • If you are going to create the object in the .kv:

    GroupScreen:
        groupName:groupName
        ...
    

    Then it is not necessary to declare it in the .py.

    On the other hand the addition of children to a widget is not instantaneous so it is always recommended in these cases to use Clock.

    import kivy
    
    kivy.require('1.9.0')  # replace with your current kivy version !
    from kivy.uix.screenmanager import Screen
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.core.window import Window
    from kivy.clock import Clock
    
    
    Window.size = (500, 230)
    
    
    class GroupScreen(Screen):
        def __init__(self, **kwargs):
            super(GroupScreen, self).__init__(**kwargs)
            Clock.schedule_once(lambda dt: setattr(self.groupName, 'text', "Test"))
    
    class Group(App):
        def build(self):
            self.root = Builder.load_file('test.kv')
            return self.root
    
    
    if __name__ == '__main__':
        Group().run()