我在蟒蛇但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()
因为我已经能够计算得到了由用户选择哪一行我还可以计算正被选择在RecycleView什么数据。不过,我想对这种行选择的一个整洁的视觉表现。
将不胜感激一些帮助。
您可以将黑客添加到您的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
该Buttons
是RecycleGridLayout
的孩子,所以,可用于获取Buttons
的总数。和索引到children
列表是你所期望的相反。这是标Button
的0
是指数20
和Button
标记20
是指数0
。所以index1
的计算使用这些知识来确定所选择的行中最左边的Button
的索引。然后选择行中最右边的Button
将index - 2
。该range(inde1, index2, -1)
通过选择行的Buttons
步骤。由于find_row()
被称为on_release
,该state
的instance
已经切换,因此其state
可以用来设置该行中的其他state
的Buttons
。