Kivy MD技术疑问:如何获取uix.list/OneLineAvatarIconListItem的选中项
获取KivyMD列表中的选中项
要实现获取带复选框列表的选中项,你可以通过以下步骤修改代码:
1. 给列表项关联设备数据并绑定复选框事件
修改ListItemWithCheckbox类,添加device属性存储对应设备信息,同时在KV语言中给复选框绑定状态变化事件,触发列表项的处理逻辑:
class ListItemWithCheckbox(OneLineAvatarIconListItem): device = None # 存储对应设备数据 def on_checkbox_active(self, checkbox, value): # 当复选框状态变化时,调用View的方法更新选中列表 self.parent.parent.parent.update_selected_devices(self.device, value)
同时更新KV字符串里的ListItemWithCheckbox规则,给RightCheckbox绑定on_active事件:
<ListItemWithCheckbox>: RightCheckbox: on_active: root.on_checkbox_active(self, self.active)
2. 在View类中维护选中设备列表并实现更新方法
在View类中添加selected_devices列表存储选中的设备,同时实现update_selected_devices方法来更新这个列表,再添加一个get_selected_devices方法返回选中项:
class View(MDFloatLayout): detectedDevices = list() for i in range(20): device = dict(name='DEVICE ' + str(i), index=i+1, battery_level=np.random.randint(low=0, high=101)) detectedDevices.append(device) def __init__(self, **kwargs): super().__init__(**kwargs) self.selected_devices = [] # 初始化选中设备列表 for device in self.detectedDevices: list_item = ListItemWithCheckbox(text=device['name']) list_item.device = device # 给列表项绑定设备数据 self.ids.scroll.add_widget(list_item) def update_selected_devices(self, device, is_selected): if is_selected: if device not in self.selected_devices: self.selected_devices.append(device) else: if device in self.selected_devices: self.selected_devices.remove(device) def get_selected_devices(self): # 返回所有选中的设备 return self.selected_devices
3. 添加测试按钮(可选)
如果需要直观查看选中项,可以在View的KV布局里添加一个按钮,绑定触发显示选中项的方法:
更新KV字符串:
<View>: MDFloatLayout: MDScrollView: pos_hint: {"top": 0.9} size_hint_y: 0.9 MDList: id: scroll MDRaisedButton: text: "查看选中项" pos_hint: {"center_x": 0.5, "y": 0.05} on_press: root.show_selected_devices()
然后在View类中添加show_selected_devices方法:
def show_selected_devices(self): selected = self.get_selected_devices() if selected: names = [dev['name'] for dev in selected] toast(f"选中设备:{', '.join(names)}") else: toast("未选中任何设备")
完整修改后的代码
from kivy.lang import Builder from kivymd.app import MDApp from kivymd.uix.floatlayout import MDFloatLayout from kivymd.uix.list import IRightBodyTouch, OneLineAvatarIconListItem from kivymd.uix.selectioncontrol import MDCheckbox from kivymd.toast import toast import numpy as np Builder.load_string( """ <ListItemWithCheckbox>: RightCheckbox: on_active: root.on_checkbox_active(self, self.active) <View>: MDFloatLayout: MDScrollView: pos_hint: {"top": 0.9} size_hint_y: 0.9 MDList: id: scroll MDRaisedButton: text: "查看选中项" pos_hint: {"center_x": 0.5, "y": 0.05} on_press: root.show_selected_devices() """ ) class ListItemWithCheckbox(OneLineAvatarIconListItem): device = None def on_checkbox_active(self, checkbox, value): self.parent.parent.parent.update_selected_devices(self.device, value) class RightCheckbox(IRightBodyTouch, MDCheckbox): pass class View(MDFloatLayout): detectedDevices = list() for i in range(20): device = dict(name='DEVICE ' + str(i), index=i+1, battery_level=np.random.randint(low=0, high=101)) detectedDevices.append(device) def __init__(self, **kwargs): super().__init__(**kwargs) self.selected_devices = [] for device in self.detectedDevices: list_item = ListItemWithCheckbox(text=device['name']) list_item.device = device self.ids.scroll.add_widget(list_item) def update_selected_devices(self, device, is_selected): if is_selected: if device not in self.selected_devices: self.selected_devices.append(device) else: if device in self.selected_devices: self.selected_devices.remove(device) def get_selected_devices(self): return self.selected_devices def show_selected_devices(self): selected = self.get_selected_devices() if selected: names = [dev['name'] for dev in selected] toast(f"选中设备:{', '.join(names)}") else: toast("未选中任何设备") class MainApp(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) self.view = View() def build(self): self.title = 'KivyMD选中项示例' return self.view if __name__ == '__main__': MainApp().run()
关键说明
- 每个
ListItemWithCheckbox实例都绑定了对应的device字典,确保复选框状态变化时能关联到具体设备 update_selected_devices方法负责维护选中设备列表,避免重复添加或遗漏移除- 通过
get_selected_devices可以随时获取当前所有选中的设备数据,用于后续业务逻辑处理
内容的提问来源于stack exchange,提问作者eljamba
相关产品推荐
相关产品推荐

