Search code examples
pythonkivyboxlayout

Adding widget results in "AttributeError: 'HomeScreen' object has no attribute '_trigger_layout'"


Why does this code generate the following error?

AttributeError: 'HomeScreen' object has no attribute '_trigger_layout'

class HomeScreen(BoxLayout):

    def __init__(self):

        print "homescreen"

        topbar = BoxLayout(spacing = -2, size = (64, 64), size_hint = (1, None))

        back_button = Button(size = (32, 64), size_hint = (None, 1), text = '>', font_size = 15 + 0.015 * self.height, background_color = (0.239, 0.815, 0.552, 1))
        home_button = Button(text = "HOME", font_size = 10 + 0.015 * self.width, background_color = (0.239, 0.815, 0.552, 1))
        more_button = Button(size = (32, 64), size_hint = (None, 1), text = '...', font_size = 15 + 0.015 * self.height, background_color = (0.239, 0.815, 0.552, 1))

        topbar.add_widget(back_button)
        topbar.add_widget(home_button)
        topbar.add_widget(more_button)

        self.add_widget(topbar)

Solution

  • Because you have overwritten the init method, which is needed. In the code below I am also overwriting the init method, but I am also calling the init method before it was overwritten.

    class HomeScreen(BoxLayout):
        def __init__(self, **kwargs):
            super(HomeScreen, self).__init__(**kwargs)
            ...
    

    from kivy.app import App
    from kivy.uix.slider import Slider
    from kivy.uix.treeview import TreeView, TreeViewNode
    from kivy.uix.button import Button
    from kivy.uix.slider import Slider
    from kivy.uix.label import Label
    from kivy.uix.boxlayout import BoxLayout
    from kivy.lang import Builder
    
    class HomeScreen(BoxLayout):
        def __init__(self, **kwargs):
            super(HomeScreen, self).__init__(**kwargs)
    
    
            print("homescreen")
    
            topbar = BoxLayout(spacing = 0, size = (64, 64), size_hint = (1, None))
    
            back_button = Button(size = (32, 64), size_hint = (None, 1), text = '>', font_size = 15 + 0.015 * self.height, background_color = (0.239, 0.815, 0.552, 1))
            home_button = Button(text = "HOME", font_size = 10 + 0.015 * self.width, background_color = (0.239, 0.815, 0.552, 1))
            more_button = Button(size = (32, 64), size_hint = (None, 1), text = '...', font_size = 15 + 0.015 * self.height, background_color = (0.239, 0.815, 0.552, 1))
    
            topbar.add_widget(back_button)
            topbar.add_widget(home_button)
            topbar.add_widget(more_button)
            self.add_widget(topbar)
    
    
    class TestApp(App):
        def build(self):
            return HomeScreen()
    
    if __name__ == '__main__':
        TestApp().run()
    

    enter image description here