从 Kivy/KivyMD 中的自定义列表中获取复选框的状态
Get the status of a checkbox from a Custom List in Kivy/KivyMD
我正在尝试根据 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 和自定义 Class 定义:
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 方法 (选中任何复选框时) 的 RightCheckbox
class 我尝试打印各种属性例如 MDCheckBox.active .icon .ids. .text
但其中 none 会打印任何内容以帮助我确定已选中哪个特定复选框
如果有人能提供帮助,我将不胜感激谢谢
一种方法是在 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)
我正在尝试根据 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 和自定义 Class 定义:
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 方法 (选中任何复选框时) 的 RightCheckbox
class 我尝试打印各种属性例如 MDCheckBox.active .icon .ids. .text
但其中 none 会打印任何内容以帮助我确定已选中哪个特定复选框
如果有人能提供帮助,我将不胜感激谢谢
一种方法是在 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)