如何使用Kivy RecycleView选择整行

问题描述 投票:0回答:1

我在蟒蛇但Kivy一个初学者相当新。我发现周围Kivy的文档,很难至少对我解释。到目前为止,我已经能够创造一个RecycleView我在哪里可以添加,删除和更改数据。理想情况下,我希望能够为我想,但都在每行数据属于一起有尽可能多的列。因此,如果我选择一个我想强调在该行的所有项目。我曾尝试与切换按钮,但没有成功。我根本不知道怎么我可以通过ID或其他方法在RecycleView访问每个单独的切换按钮。如果我可以访问每一个切换按钮单独我可以简单地改变其状态等于“向下”。到目前为止,我只能够找到用户选择哪一行(却不这么优雅)。我通过计算每行的按钮的数目和针对所选择的按钮的索引比较该管理这一点。

这里是我的实验,我通常喜欢使用.kv文件的示例:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.recycleview import RecycleView
from kivy.uix.togglebutton import ToggleButton
from kivy.uix.recycleview.views import RecycleDataViewBehavior


class MyButton(RecycleDataViewBehavior, ToggleButton):
    index = None

    def refresh_view_attrs(self, rv, index, data):
        """ Catch and handle the view changes """
        self.index = index
        return super(MyButton, self).refresh_view_attrs(
            rv, index, data)


class TestRecycleView(RecycleView):
    items_per_row = 3
    selected_data = None
    selected_row = None

    def find_row(self, instance):
        self.selected_row = instance.index // self.items_per_row + 1
        print('Row: ', self.selected_row)
        self.selected_data = self.data[(self.selected_row - 1) * self.items_per_row: self.items_per_row
                                       * self.selected_row]
        print('Data: ', self.selected_data)


KV = '''

<MyButton>:
    on_release:
        app.root.find_row(self)

TestRecycleView:
    data: [{'text': str(x)} for x in range(21)]
    viewclass: 'MyButton'
    id: rv_controller
    target_id: None
    RecycleGridLayout:
        cols: 3
        default_size_hint: 1, None
        orientation: 'vertical'
        key_selection: 'selectable'
        default_size: None, dp(26)
        size_hint_y: None
        height: self.minimum_height
        multiselect: True
        touch_multiselect: True

'''


class Test(App):
    def build(self):
        root = Builder.load_string(KV)
        # root.data = items
        return root


Test().run()

因为我已经能够计算得到了由用户选择哪一行我还可以计算正被选择在Re​​cycleView什么数据。不过,我想对这种行选择的一个整洁的视觉表现。

将不胜感激一些帮助。

python kivy kivy-language recyclerview-layout
1个回答
1
投票

您可以将黑客添加到您的find_row()方法来设置所有按钮的状态在一排。此方法将它们与选择的Button实例的状态一致,所以你也可以取消。

def find_row(self, instance):
    rgl = self.ids.gl
    num_buttons = len(rgl.children)
    num_rows = num_buttons // self.items_per_row
    self.selected_row = instance.index // self.items_per_row + 1
    print('Row: ', self.selected_row)
    self.selected_data = self.data[(self.selected_row - 1) * self.items_per_row: self.items_per_row
                                   * self.selected_row]
    print('Data: ', self.selected_data)
    index1 = (num_rows - self.selected_row + 1) * self.items_per_row - 1
    index2 = index1 - self.items_per_row
    state = instance.state
    for index in range(index1, index2, -1):
        rgl.children[index].state = state

这也需要设置RecycleGridLayout当ID:

id: gl

ButtonsRecycleGridLayout的孩子,所以,可用于获取Buttons的总数。和索引到children列表是你所期望的相反。这是标Button0是指数20Button标记20是指数0。所以index1的计算使用这些知识来确定所选择的行中最左边的Button的索引。然后选择行中最右边的Buttonindex - 2。该range(inde1, index2, -1)通过选择行的Buttons步骤。由于find_row()被称为on_release,该stateinstance已经切换,因此其state可以用来设置该行中的其他stateButtons

© www.soinside.com 2019 - 2024. All rights reserved.