首页 > 解决方案 > 如何在 Kivymd 列表中激活列表

问题描述

这是示例中的代码。这里有一个猕猴桃标记。但是如何赋予这个代码功能。例如,这样在取消复选框后,该项目就会从列表中消失。我只能删除图标。我尝试在那里添加 on_release 函数,但它并没有解决问题。

from kivy.lang import Builder
from kivy.properties import StringProperty

from kivymd.app import MDApp
from kivymd.uix.list import IRightBodyTouch, OneLineAvatarIconListItem
from kivymd.uix.selectioncontrol import MDCheckbox
from kivymd.icon_definitions import md_icons


KV = '''
<ListItemWithCheckbox>:

    IconLeftWidget:
        icon: root.icon

    RightCheckbox:


BoxLayout:

    ScrollView:

        MDList:
            id: scroll
'''


class ListItemWithCheckbox(OneLineAvatarIconListItem):
    '''Custom list item.'''

    icon = StringProperty("android")


class RightCheckbox(IRightBodyTouch, MDCheckbox):
    '''Custom right container.'''


class MainApp(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def on_start(self):
        icons = list(md_icons.keys())
        for i in range(30):
            self.root.ids.scroll.add_widget(
                ListItemWithCheckbox(text=f"Item {i}", icon=icons[i])
            )


MainApp().run()

标签: pythonandroidpython-3.xkivykivymd

解决方案


首先,您需要创建一个方法从滚动小部件中删除小部件,该小部件将获取ListItemWithCheckbox实例并将其从列表中删除,只需链接如下

from kivy.lang import Builder
from kivy.properties import StringProperty

from kivymd.app import MDApp
from kivymd.uix.list import IRightBodyTouch, OneLineAvatarIconListItem
from kivymd.uix.selectioncontrol import MDCheckbox
from kivymd.icon_definitions import md_icons

KV = '''
<ListItemWithCheckbox>:

    IconLeftWidget:
        icon: root.icon

    RightCheckbox:
        # add this line that will call the remove widget when we change the check box state and will pass the 
        # ListItemWithCheckbox widget that will be removed from the list
        on_active:app.remove_widget(root)

BoxLayout:

    ScrollView:

        MDList:
            id: scroll
'''


class ListItemWithCheckbox(OneLineAvatarIconListItem):
    '''Custom list item.'''

    icon = StringProperty("android")


class RightCheckbox(IRightBodyTouch, MDCheckbox):
    '''Custom right container.'''


class App(MDApp):
    def build(self):
        return Builder.load_string(KV)

    # create method to remove list item
    def remove_widget(self, widget):
        print(widget.text)
        self.root.ids.scroll.remove_widget(widget)

    def on_start(self):
        icons = list(md_icons.keys())
        for i in range(30):
            self.root.ids.scroll.add_widget(
                ListItemWithCheckbox(text=f"Item {i}", icon=icons[i])
            )


App().run()

推荐阅读