Search code examples
pythoninheritancemethodskivypython-dataclasses

Inheritance with dataclasses for GridLayout of Kivy Python 3


I would like to do that:

import kivy 
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
from dataclasses import dataclass

class MyGrid(GridLayout):
    def __init__(self, **kwargs):
        super.(MyGrid,self).__init__(**kwargs)
        self.cols = 2
        self.add_widget(Label(text="Pseudo: "))
        self.pseudo = TextInput(multiline=False)
        self.add_widget(self.pseudo)

class MyApp(App): 
    def build(self):
        return MyGrid()



if __name__ == "__main__": 
    MyApp().run()

but with dataclasses. I have made several searches but didn't find anything.

Thanks to @JohnAnderson advices, I tried that:

@dataclass
class MyGrid(GridLayout):
    pass


@dataclass
class MyApp(App):
    def build(self):
        root = MyGrid()
        root.cols = 2
        pseudo = TextInput(multiline=False)
        root.add_widget(Label(text="Pseudo: "))
        root.add_widget(pseudo)
        return root

if __name__ == "__main__": 
    MyApp().run() 

but I get this error:

File AppData\Local\Programs\Python\Python310\lib\site-packages\kivy\app.py", line 921, in _run_prepare
     if not self.built:
 AttributeError: 'MyApp' object has no attribute 'built'. Did you mean: 'build'?

These add_widget methods came from GridLayout of Kivy.

Someone could help to do this with dataclasses? Thanks in advance.


Solution

  • Here is a simple way to do what you want:

    class MyApp(App): 
        def build(self):
            root = MyGrid()
            
            root.cols = 2
            pseudo = TextInput(multiline=False)
    
            root.add_widget(Label(text="Pseudo: "))
            root.add_widget(pseudo)
            return root