Reputation: 371
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 "kivy\properties.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:\documents\kivy-trial\main.py", line 63, in <module>
HyperSearch().run()
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\app.py", line 950, in run
runTouchApp()
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\base.py", line 582, in runTouchApp
EventLoop.mainloop()
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\base.py", line 347, in mainloop
self.idle()
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\base.py", line 391, in idle
self.dispatch_input()
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\base.py", line 342, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\base.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\core\window\__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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\core\window\__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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\relativelayout.py", line 297, in on_touch_down
ret = super(RelativeLayout, self).on_touch_down(touch)
File "C:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\widget.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\widget.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\widget.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\widget.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\uix\behaviors\button.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:\Users\mayan\AppData\Local\Programs\Python\Python39\lib\site-packages\kivy\lang\builder.py", line 57, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Documents\kivy-trial\kivy_file.kv", line 58, in <module>
on_press: app.get_search()
File "C:\documents\kivy-trial\main.py", line 51, in get_search
engine_input = self.root.ids.raw_search
File "kivy\properties.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
Upvotes: 1
Views: 1190
Reputation: 38822
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.
Upvotes: 1
Reputation: 1128
Let's give you a simple example of how to use the magic id
attribute of kivy !
from kivy.lang import Builder
from kivymd.app import MDApp
KV = '''
BoxLayout:
Button:
id: my_button
text: "let's try !"
'''
class MyApp(MDApp):
def build(self):
self.screen = Builder.load_string(KV)
print("this is the app:",self)
print("this is the visual of the app:",self.screen)
print("this is the dictionnary of all object referenced with id in the app KV:",self.screen.ids)
print("this is my button:", self.screen.ids["my_button"])
print("let's bind a function to my button referenced in the KV object")
self.screen.ids["my_button"].bind(on_press=self.on_button_press)
return self.screen
def on_button_press(self, instance):
print("this is the widget linked to this event call (here it's the button):", instance)
print("here you can do whatever you want, yes kivy is easy !")
if __name__ == '__main__':
MyApp().run()
Don't hesitate to question if something isn't clear or if I missed the question :)
PS: if you want to use a .kv
file, it will work the same way ! Just replace Builder.load_string(KV)
by Builder.load_file("kivy_file.kv")
.
You already did it well, I just want to say that it won't change anything. ;)
Upvotes: 0