Как я могу получить доступ к элементу RecycleView Kivy? - PullRequest
0 голосов
/ 16 апреля 2020

Интересно узнать, как получить доступ к виджетам в RecycleView. Я построил простой пример:

main.py

from kivy.app import App
from kivy.properties import ListProperty
from kivy.uix.boxlayout import BoxLayout


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
        print(self.ids)


class TestApp(App):
    def build(self):
        bl = ShowBoxLayout()
        return bl


app = TestApp()
app.run()

test.kv

<ShowBoxLayout>:
    RecycleView:
        viewclass: 'TextInput'
        data: [{'id': str(x)} for x in range(10)]
        RecycleGridLayout:
            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()

В этом случае я не могу получить доступ к TextInput внутри него ни с идентификаторами, ни с чем-либо остальное. Как мне получить к нему доступ, чтобы получить в них текст?

Вот так выглядит экран. screen

и вот что я получаю после нажатия кнопки: {}.

1 Ответ

0 голосов
/ 16 апреля 2020

Проблема в том, что вы не можете назначить словарь 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, а только отображаемые в данный момент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...