Проблема в том, что вы не можете назначить словарь ids
в python. Это может быть сделано только в kv
. Таким образом, другой способ получить доступ к элементам - назначить id
для RecycleGridLayout
, а затем посетить каждого из его детей. Вы также можете определить метод вашего viewclass
для отображения введенного текста:
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
class ShowBoxLayout(BoxLayout):
keys = ListProperty()
def __init__(self, **kwargs):
super(ShowBoxLayout, self).__init__(**kwargs)
self.keys = [x for x in range(5)]
def print_list(self):
#here I expect textinputs id but got empty dict
for child in self.ids.grid.children:
print(child, child.text, child.id)
class MyTextInput(TextInput):
def __init__(self, **kwargs):
super(MyTextInput, self).__init__(**kwargs)
self.multiline = False
self.on_text_validate = self.get_text
def get_text(self):
print('get_text:', self.text)
Builder.load_string('''
<ShowBoxLayout>:
RecycleView:
viewclass: 'MyTextInput'
data: [{'id': str(x)} for x in range(10)]
RecycleGridLayout:
id: grid
cols: 1
default_size: None, dp(26)
default_size_hint: 1, None
size_hint_y: None
height: self.minimum_height
orientation: 'vertical'
multiselect: False
touch_multiselect: False
Button:
text : 'Hello world'
on_press : root.print_list()
''')
class TestApp(App):
def build(self):
bl = ShowBoxLayout()
return bl
app = TestApp()
app.run()
(я использовал Builder.load_string()
для удобства)
Обратите внимание, что, поскольку это RecycleView
, элементы viewclass
перерабатываются, поэтому метод print_list()
может не посещать элемент для каждого элемента data
, а только отображаемые в данный момент.