You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 04:43:20