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

Kivymd如何无需自定义类在MDList列表项中添加复选框?

无需自定义列表类实现带复选框MDList的方案

可以直接使用KivyMD原生组件实现需求,天然适配ScreenManager多屏幕场景,不会出现自定义类导致的作用域绑定异常问题。

核心实现逻辑

  • 直接使用KivyMD原生的列表组件(如TwoLineAvatarIconListItem),无需继承自定义
  • 实例化列表项时,同步创建MDCheckbox作为右侧控件添加到列表项中
  • 遍历MDList子组件时直接判断子控件里的复选框激活状态即可获取选中内容

带ScreenManager的完整可运行代码

from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.screenmanager import MDScreenManager, MDScreen
from kivymd.uix.list import TwoLineAvatarIconListItem, IconLeftWidget
from kivymd.uix.selectioncontrol import MDCheckbox

KV = """
<ScreenManager>
    ListScreen:
        name: "list_screen"

<ListScreen>:
    BoxLayout:
        orientation: "vertical"
        ScrollView:
            MDList:
                id: scroll
        MDRaisedButton:
            text: "保存选中项"
            pos_hint: {"center_x": 0.5}
            on_release: app.save_checked()
"""

class ListScreen(MDScreen):
    pass

class MainApp(MDApp):
    def build(self):
        Builder.load_string(KV)
        self.sm = MDScreenManager()
        self.sm.add_widget(ListScreen(name="list_screen"))
        return self.sm

    def on_start(self):
        # 动态生成带复选框的列表项
        for i in range(15):
            # 创建原生列表项
            list_item = TwoLineAvatarIconListItem(
                text=f"选项 {i}",
                secondary_text=f"选项描述 {i+10}"
            )
            # 添加左侧图标
            list_item.add_widget(IconLeftWidget(icon="account-circle"))
            # 添加右侧复选框,绑定到列表项的自定义属性方便后续查找
            list_item.checkbox = MDCheckbox(pos_hint={"center_y": 0.5})
            list_item.add_widget(list_item.checkbox)
            # 把列表项加入MDList
            self.sm.get_screen("list_screen").ids.scroll.add_widget(list_item)

    def save_checked(self):
        selected_items = []
        mdlist = self.sm.get_screen("list_screen").ids.scroll
        # 遍历所有列表项
        for item in mdlist.children:
            if hasattr(item, "checkbox") and item.checkbox.active:
                selected_items.append(item.text)
        # 反转顺序和列表显示顺序保持一致
        selected_items = selected_items[::-1]
        print("选中的内容:", selected_items)

if __name__ == "__main__":
    MainApp().run()

关键说明

  • 多屏幕场景下要通过screen_manager.get_screen(屏幕名)的方式获取对应屏幕的控件引用,不要直接用全局root的id,这是之前自定义类方案在多屏幕下失效的核心原因
  • 复选框直接绑定到列表项的自定义属性上,不需要依赖kv语言定义的id,避免作用域冲突
  • 不需要额外继承列表类和右侧容器类,完全用原生组件组合实现需求

内容的提问来源于stack exchange,提问作者Shourov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:09:03