Kivy: Invalid instance in App.root

Question:

I am new to Python as well as Kivy, this is my first small project, and don’t know what I did wrong, following is the log from pydev(eclipse):

[INFO              ] Kivy v1.8.0
[INFO              ] [Logger      ] Record log in C:UsersSudheer.kivylogskivy_14-06-21_10.txt
[INFO              ] [Factory     ] 157 symbols loaded
[DEBUG             ] [Cache       ] register <kv.lang> with limit=None, timeout=Nones
[DEBUG             ] [Cache       ] register <kv.image> with limit=None, timeout=60s
[DEBUG             ] [Cache       ] register <kv.atlas> with limit=None, timeout=Nones
[INFO              ] [Image       ] Providers: img_tex, img_dds, img_pygame, img_gif (img_pil ignored)
[DEBUG             ] [Cache       ] register <kv.texture> with limit=1000, timeout=60s
[DEBUG             ] [Cache       ] register <kv.shader> with limit=1000, timeout=3600s
[INFO              ] [Text        ] Provider: pygame
[DEBUG             ] [Cache       ] register <kv.loader> with limit=500, timeout=60s
[INFO              ] [Loader      ] using a thread pool of 2 workers
[DEBUG             ] [Cache       ] register <textinput.label> with limit=None, timeout=60.0s
[DEBUG             ] [Cache       ] register <textinput.width> with limit=None, timeout=60.0s
[DEBUG             ] [App         ] Loading kv <D:OS FilesworkspaceKalSrcmyclass.kv>
[DEBUG             ] [App         ] kv <D:OS FilesworkspaceKalSrcmyclass.kv> not found
[CRITICAL          ] App.root must be an _instance_ of Widget
 Traceback (most recent call last):
   File "D:OS FilesworkspaceKal__main__.py", line 9, in <module>
     MyClass().run()    
   File "C:Kivy180kivykivyapp.py", line 772, in run
     raise Exception('Invalid instance in App.root')
 Exception: Invalid instance in App.root

Code file structure is as follows:

File Structure Under Pydev

Codes are as follows:
File:main.py

from Src.AppStart import MyClass

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

File:AppStart.py:

from kivy.app import App
from Src.Logins.LoginForm import LoginForm
from kivy.uix.button import Button

class MyClass(App):
    '''
    classdocs
    '''
    def build(self):
        c=LoginForm
        #c=Button(text="Checked")
        return c

File:LoginForm.py:

from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Color
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput

class LoginForm(GridLayout):
    '''
    classdocs
    '''
    def __init__(self, **kwargs):
        #kwargs['cols'] = 1

        #Layout=GridLayout(cols=2, rows=3, background_color=Color(1,1,1))
        self.cols=2
        self.rows=3
        self.background_color=Color(1,1,1)

        IDlbl =Label(text="User ID: ")
        PWlbl =Label(text="Password: ")
        IDtxtbox = TextInput(text="",multiline=False)
        PWtxtbox = TextInput(text="",multiline=False, password=True)

        self.add_widget(IDlbl)
        self.add_widget(PWlbl)
        self.add_widget(IDtxtbox)
        self.add_widget(PWtxtbox)
        #return Layout
        super(LoginForm, self).__init__(**kwargs)

Could you please let me know why is App.root is an invalid instance,

Asked By: surpavan

||

Answers:

The return value of App.build() is assigned as App.root. In your build() you return a class (LoginForm) instead of an instance of the class. Simply changing that line in build() to c = LoginForm() should fix it.

Answered By: kitti
#The wrong just you are forget to add brackets to the end #of class it's want to return.
#Ex:
from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.gridlayout import  GridLayout
from kivy.uix.textinput import TextInput 
from kivy.uix.widget import Widget


class MyGridLayout(GridLayout,Widget):
    pass


class myapp(App):
    def build(self):
        return MyGridLayout()#  <==== exactly here####

if __name__=="__main__" :
    myapp().run()
Answered By: Somar Jaber
Categories: questions Tags: , , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.