Python 3.x 从Kivy/KivyMD中的自定义列表中获取复选框的状态

Python 3.x 从Kivy/KivyMD中的自定义列表中获取复选框的状态,python-3.x,kivy,kivy-language,kivymd,Python 3.x,Kivy,Kivy Language,Kivymd,我正在尝试一个基于KivyMD文档的自定义列表项,但是我在识别我的哪个支票盒被激活时遇到了问题。 使用*args我可以访问它的状态以及它是哪个对象,但它的打印方式如下: {,False} 问题在于,“0x000001B1A62E6970”不是一个常量值(该值可能会随着代码的执行而改变),该值表示复选框与其id相同 我的最小代码KV: KV = ''' MDCard: orientation : 'vertical' size_hint : (0.8,0.3) pos_hi

我正在尝试一个基于KivyMD文档的自定义列表项,但是我在识别我的哪个支票盒被激活时遇到了问题。 使用
*args
我可以访问它的状态以及它是哪个对象,但它的打印方式如下:
{
False}

问题在于,
“0x000001B1A62E6970”
不是一个常量值(该值可能会随着代码的执行而改变),该值表示复选框与其id相同

我的最小代码KV:

KV = '''
MDCard:
    orientation : 'vertical'
    size_hint : (0.8,0.3)
    pos_hint : {"center_x":.5,"center_y":.5}
    elevation : 15
    padding : 20
    spacing : 30
    id: box
    MDList:
        id: scroll

<ListItemWithCheckbox>:

    IconLeftWidget:
        icon: root.icon

    RightCheckbox: 
'''
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

class ListItemWithCheckbox(OneLineAvatarIconListItem):
    '''Custom list item.'''
    icon = StringProperty("android")

    def on_press(self):
        print(self.text)

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

    def on_active(self, *args):
        print(args)

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

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

MainApp().run()
我尝试过的:

KV = '''
MDCard:
    orientation : 'vertical'
    size_hint : (0.8,0.3)
    pos_hint : {"center_x":.5,"center_y":.5}
    elevation : 15
    padding : 20
    spacing : 30
    id: box
    MDList:
        id: scroll

<ListItemWithCheckbox>:

    IconLeftWidget:
        icon: root.icon

    RightCheckbox: 
'''
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

class ListItemWithCheckbox(OneLineAvatarIconListItem):
    '''Custom list item.'''
    icon = StringProperty("android")

    def on_press(self):
        print(self.text)

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

    def on_active(self, *args):
        print(args)

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

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

MainApp().run()
我曾尝试为RightCheckbox提供一个默认id,以便在以后将小部件放入列表时将其更改为唯一的id,从而以类似“root.ids.checkboxid”的方式访问它们的状态,但我不知道在执行
self.root.ids.scroll.add_小部件时如何放置它(ListItemWithCheckbox(text=f“Item{I}”,icon=icons[I]))

另外,在
RightCheckbox
类的on_active方法(选中任何复选框时)中,我尝试打印各种属性,例如
MDCheckBox.active.icon.ids。文本
,但它们都没有打印任何内容来帮助我识别已选中的特定复选框


如果有人能帮助我,我将不胜感激。

一种方法是在
右侧复选框中创建对
列表项WithCheckBox
的引用,如下所示:

<ListItemWithCheckbox>:

    IconLeftWidget:
        icon: root.icon

    RightCheckbox: 
        listItem: root

你的答案很完美。我真的不知道您可以指定一个不同于默认MDCheckbox定义的自定义值,我将考虑是否可以建议将您的答案添加到文档中以补充示例。