我如何访问RecycleView Kivy的元素?

2024-10-03 21:34:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何访问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()

试验电压(千伏)

<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()

在这种情况下,我无法使用ID或其他任何东西访问其中的TextInput。我应该如何访问它以获取其中的文本

这就是屏幕的样子。 screen

这是我按下按钮后得到的:{}


Tags: fromimportselfnoneappsizedefclass
1条回答
网友
1楼 · 发布于 2024-10-03 21:34:38

问题是您不能在python中为ids字典赋值。这只能在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元素的项,而只访问当前显示的项

相关问题 更多 >