【问题标题】:Get the status of a checkbox from a Custom List in Kivy/KivyMD从 Kivy/KivyMD 的自定义列表中获取复选框的状态
【发布时间】:2021-05-06 07:08:12
【问题描述】:

我正在尝试基于 KivyMD 的文档 examples 的自定义列表项,但在识别我的哪些复选框已被激活时遇到问题。 使用* args,我可以访问它的状态以及它是哪个对象,但它会像这样打印: {<__ main __. RightCheckbox object at 0x000001B1A62E6970>, 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: 
'''

以及 MainApp 和自定义类定义:

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_widget (ListItemWithCheckbox (text = f "Item {i}", icon = icons [i]))

也在on_active方法(选择任意复选框时) em> RightCheckbox class我试图打印各种属性,如MDCheckBox.active .icon .ids. .text但其中没有一个都打印任何东西来帮助我识别选择了哪个特定的复选框

如果有人能提供帮助,我将不胜感激,谢谢

【问题讨论】:

    标签: python-3.x kivy kivy-language kivymd


    【解决方案1】:

    一种方法是在RightCheckbox 中创建对ListItemWithCheckbox 的引用,如下所示:

    <ListItemWithCheckbox>:
    
        IconLeftWidget:
            icon: root.icon
    
        RightCheckbox: 
            listItem: root
    

    那么您的 on_active() 方法可以使用该引用:

    class RightCheckbox(IRightBodyTouch, MDCheckbox):
        '''Custom right container.'''
    
        def on_active(self, rcb, value):
            print(rcb.listItem.text, 'is', value)
    

    【讨论】:

    • 您的回答非常完美。我真的不知道您可以分配与默认 MDCheckbox 定义的值不同的自定义值,我会看看是否可以建议将您的答案添加到文档中以补充示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多