Skip to content
Advertisement

How to reference widgets inside widgets using IDs in Kivy, Kivy Lang, Kivy MD

okay, THIS HAS BEEN DRIVING ME INSANE FOR LIKE THE PAST TWO DAYS. and its really annoying, so i am building an application using kivy, after getting used “easy as pie” tkinter I thought it was time to learn kivy (as it has mobile compatibility).

#I wanted to learn to reference different widgets# I searched YouTube and google for hours but to no avail I keep getting an error message

my code:

.py

# Imports
import webbrowser
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.screenmanager import Screen


# ToDo: Monetizing the Application

def Monetize():
    pass


def hide():
    # hidden func thats not related to code for now

# configuring the Application
class HyperSearch(App):
    main_text = "None"

    # initialing the Application
    def __init__(self, **kwargs):
        super(HyperSearch, self).__init__(**kwargs)
        self.a = Builder.load_file("kivy_file.kv")

    def get_search(self):
        engine_input = self.root.ids.raw_search

    # building the Application
    def build(self):
        screen = Screen()
        screen.add_widget(self.a)
        #  screen.add_widget("")
        return screen


# Running The Application in main loop
if __name__ == "__main__":
    HyperSearch().run()

# ToDo: Copyright Claim The Application and its code

.kv

    <HyperSearch>:
GridLayout:
    cols: 2
    BoxLayout:
        orientation: "vertical"
        size_hint: None, 1
        size: "120dp",  0
        spacing: 5

        Button:
            text: "Toggle Shopping Search"
            text_size: self.size
            halign: 'center'
            valign: 'middle'

        Button:
            text: "Toggle Music Search"
            text_size: self.size
            halign: 'center'
            valign: 'middle'

        Button:
            text: "View History"
            text_size: self.size
            halign: 'center'
            valign: 'middle'

    BoxLayout:
        orientation: "vertical"
        valign: "top"
        TextInput:
            valign: "center"
            orientation: "vertical"
            font_size: 30
            size_hint: 1, None
            size: 0, "50dp"
            pos_hint: {"top":1}
            hint_text: "Search-Engine"
            icon_right: "android"
            helper_text: "Devices with under 1gb RAM may crash"
            helper_text_mode: "on_focus"
            multiline: False
            id: raw_search



        GridLayout:
            cols: 2
            size_hint: 1, None
            size: 0, "100dp"
            spacing: 10
            Button:
                text: "Search!!"
                text_size: self.size
                halign: 'center'
                valign: 'middle'
                size_hint: .5, 1
                on_press: app.get_search()
            Button:
                text: "Small Search :("
                text_size: self.size
                halign: 'center'
                valign: 'middle'
                size_hint: .5, 1
        GridLayout:
            cols: 2
            size_hint: 1, None
            size: 0, "100dp"
            Label:
                text: "log:"

            Label:
                text: app.main_text

and

my error

   
[INFO   ] [Base        ] Start application main loop
[INFO   ] [Base        ] Leaving application in progress...
 Traceback (most recent call last):
   File "kivyproperties.pyx", line 861, in kivy.properties.ObservableDict.__getattr__
 KeyError: 'raw_search'
 
 During handling of the above exception, another exception occurred:
 
 Traceback (most recent call last):
   File "C:documentskivy-trialmain.py", line 63, in <module>
     HyperSearch().run()
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyapp.py", line 950, in run
     runTouchApp()
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivybase.py", line 582, in runTouchApp
     EventLoop.mainloop()
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivybase.py", line 347, in mainloop
     self.idle()
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivybase.py", line 391, in idle
     self.dispatch_input()
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivybase.py", line 342, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivybase.py", line 248, in post_dispatch_input
     listener.dispatch('on_motion', etype, me)
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivycorewindow__init__.py", line 1412, in on_motion
     self.dispatch('on_touch_down', me)
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivycorewindow__init__.py", line 1428, in on_touch_down
     if w.dispatch('on_touch_down', touch):
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixrelativelayout.py", line 297, in on_touch_down
     ret = super(RelativeLayout, self).on_touch_down(touch)
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixwidget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixwidget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixwidget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixwidget.py", line 545, in on_touch_down
     if child.dispatch('on_touch_down', touch):
   File "kivy_event.pyx", line 709, in kivy._event.EventDispatcher.dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivyuixbehaviorsbutton.py", line 151, in on_touch_down
     self.dispatch('on_press')
   File "kivy_event.pyx", line 705, in kivy._event.EventDispatcher.dispatch
   File "kivy_event.pyx", line 1248, in kivy._event.EventObservers.dispatch
   File "kivy_event.pyx", line 1132, in kivy._event.EventObservers._dispatch
   File "C:UsersmayanAppDataLocalProgramsPythonPython39libsite-packageskivylangbuilder.py", line 57, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "C:Documentskivy-trialkivy_file.kv", line 58, in <module>
     on_press: app.get_search()
   File "C:documentskivy-trialmain.py", line 51, in get_search
     engine_input = self.root.ids.raw_search
   File "kivyproperties.pyx", line 864, in kivy.properties.ObservableDict.__getattr__
 AttributeError: 'super' object has no attribute '__getattr__'

Process finished with exit code 1

P.S: THE ERROR ONLY SHOWS AFTER I HAVE PRESSED THE BUTTON

please help, thanks in advance, to who ever took the time to read my post

Advertisement

Answer

In order to use ids, you must define the id within your kv. So, to use the raw_search id you must define it in your kv like this:

    TextInput:
        id: raw_search

Then in your code:

def get_search(self):
    engine_input = self.a.ids.raw_search.text
    print(engine_input)

Note that the ids dictionary is built within the widget that is the root of the rule containing the id. In your case, the ids are in the GridLayout. So, to access that GridLayout widget, you must use self.a. Also, I assumed that the <HyperSearch>: line in your kv was a typo and removed it.

User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement