В моей программе kivy / python я добавляю строку нажатием кнопки. В функции init моей строки я создаю переменные, которые мне нужны в файле строки kivy. Думаю, это не работает, потому что сначала строится строка, а только потом вызывается функция инициализации. Есть ли способ изменить порядок? Заранее спасибо!
Я добавляю свою строку так: self.ids.container.add_widget(Row(link))
Некоторый код для уточнения:
main.py
class AllitemsScreen(Screen):
def AddItem(self, link):
row = Row(link)
self.ids.container.add_widget(row)
class Row(BoxLayout):
def __init__(self, link, **kwargs):
super(Row, self).__init__(**kwargs)
item_dict[self] = Item(link)
self.image_source = item_dict[self].image
self.itemname = item_dict[self].name
kiv file:
Row>:
orientation: "horizontal"
BoxLayout:
orientation: "vertical"
font_name:"Nunito"
Label:
text: root.itemname
font_name:"Nunito"
Button:
id: root.count
text: "delete item"
on_press: root.delete_item()
Image:
source: root.image_source
width: 100
Итак, когда вызывается AddItem, создается новая строка. Я получаю следующую ошибку:
Traceback (most recent call last):
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124, in <module>
source: root.image_source
File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
AttributeError: 'Row' object has no attribute 'image_source'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 692, in _apply_rule
rctx['ids'])
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 254, in create_handler
cause=tb)
kivy.lang.builder.BuilderException: Parser: File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124:
...
122: on_press: root.delete_item()
123: Image:
>> 124: source: root.image_source
125: width: 100
126:
...
AttributeError: 'Row' object has no attribute 'image_source'
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124, in <module>
source: root.image_source
File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "main.py", line 95, in <module>
MyApp().run()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\app.py", line 855, in run
runTouchApp()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\base.py", line 504, in runTouchApp
EventLoop.window.mainloop()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 747, in mainloop
self._mainloop()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\core\window\window_sdl2.py", line 479, in _mainloop
EventLoop.idle()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\base.py", line 342, in idle
self.dispatch_input()
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\base.py", line 327, in dispatch_input
post_dispatch_input(*pop(0))
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\base.py", line 233, in post_dispatch_input
listener.dispatch('on_motion', etype, me)
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\core\window\__init__.py", line 1402, in on_motion
self.dispatch('on_touch_down', me)
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\core\window\__init__.py", line 1418, in on_touch_down
if w.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\screenmanager.py", line 1191, in on_touch_down
return super(ScreenManager, self).on_touch_down(touch)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\relativelayout.py", line 288, in on_touch_down
ret = super(RelativeLayout, self).on_touch_down(touch)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 549, in on_touch_down
if child.dispatch('on_touch_down', touch):
File "kivy\_event.pyx", line 707, in kivy._event.EventDispatcher.dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\behaviors\button.py", line 151, in on_touch_down
self.dispatch('on_press')
File "kivy\_event.pyx", line 703, in kivy._event.EventDispatcher.dispatch
File "kivy\_event.pyx", line 1214, in kivy._event.EventObservers.dispatch
File "kivy\_event.pyx", line 1098, in kivy._event.EventObservers._dispatch
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback
exec(__kvlang__.co_value, idmap)
File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 49, in <module>
on_press: root.manager.screens[1].AddItem(input.text), app.AddImage(), root.manager.screens[1].AddRow(), app.ShowPopup()
File "main.py", line 47, in AddItem
row = Row(link)
File "main.py", line 57, in __init__
super(Row, self).__init__(**kwargs)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\boxlayout.py", line 145, in __init__
super(BoxLayout, self).__init__(**kwargs)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\layout.py", line 76, in __init__
super(Layout, self).__init__(**kwargs)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 361, in __init__
rule_children=rule_children)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\uix\widget.py", line 469, in apply_class_lang_rules
rule_children=rule_children)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 538, in apply
rule_children=rule_children)
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 707, in _apply_rule
e), cause=tb)
kivy.lang.builder.BuilderException: Parser: File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124:
...
122: on_press: root.delete_item()
123: Image:
>> 124: source: root.image_source
125: width: 100
126:
...
BuilderException: Parser: File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124:
...
122: on_press: root.delete_item()
123: Image:
>> 124: source: root.image_source
125: width: 100
126:
...
AttributeError: 'Row' object has no attribute 'image_source'
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 249, in create_handler
return eval(value, idmap), bound_list
File "C:\Users\caspe\Documents\Casper app\myapp.kv", line 124, in <module>
source: root.image_source
File "kivy\weakproxy.pyx", line 32, in kivy.weakproxy.WeakProxy.__getattr__
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 692, in _apply_rule
rctx['ids'])
File "C:\Users\caspe\Anaconda3\lib\site-packages\kivy\lang\builder.py", line 254, in create_handler
cause=tb)