Python KivyMD:如何在MDCheckboxes上使用on_active?

时间:2019-06-21 00:31:50

标签: python checkbox kivy kivy-language

我目前在MDCheckbox方面遇到一些问题。当我使用默认的Kivy Checkbox时,on_active代码中的kv参数似乎工作得很好。但是现在,我尝试将KivyMD MDCheckbox模块与MDList结合使用,并尝试通过on_active参数将功能添加到Checkbox:

kv代码的一部分

#:kivy 1.11.0
#:import MDCard kivymd.card.MDCard
#:import MDCheckbox kivymd.selectioncontrols.MDCheckbox
#:import MDList kivymd.list.MDList
#:import OneLineAvatarIconListItem kivymd.list.OneLineAvatarIconListItem

<ListItemWithCheckbox@OneLineAvatarIconListItem>:
    MyAvatar:
        source: 'src/hdl.jpg'
    MyCheckbox:

<LayoutPy>
    orientation: 'vertical'

    FloatLayout:

        MDCard:
            size_hint: .8, .5
            pos_hint: {'center_x': 0.5, 'center_y': 0.5}

            BoxLayout:
                orientation: 'horizontal'
                spacing: 20
                name: 'lists'

                ScrollView:

                    MDList:
                        id: scroll

                        ListItemWithCheckbox:
                            id: ckbx1
                            text: 'Box 1'
                            active: False
                            on_active: root.printS('Text 1')


                        ListItemWithCheckbox:
                            id: ckbx2
                            text: 'Box 2'
                            active: False
                            on_active: root.printS('Text 2')

                        ListItemWithCheckbox:
                            id: ckbx3
                            text: 'Box 3'
                            active: False
                            on_active: root.printS('Text 3')

Python代码的一部分

from kivy.app import App
from kivy.uix.floatlayout import FloatLayout
from kivymd.theming import ThemeManager
from kivy.uix.image import Image
from kivymd.list import IRightBodyTouch, ILeftBody
from kivymd.selectioncontrols import MDCheckbox
from kivy.lang import Builder

class LayoutPy(FloatLayout):
    def __init__(self, **kwargs):
        super(LayoutPy, self).__init__(**kwargs)

    def printS(self, text):
        print(text)

class MyCheckbox(IRightBodyTouch, MDCheckbox):
    pass


class MyAvatar(ILeftBody, Image):
    pass

Builder.load_file(design.kv)

class KivyGUI(App):
    theme_cls = ThemeManager()
    theme_cls.primary_palette = ("Teal")
    title = ("App")

    def build(self):
        c = LayoutPy()
        return c

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

我认为,与普通的Kivy不同,KivyMD需要一个附加的active参数才能将功能添加到MDCheckbox。我尝试设置布尔值True / False的active参数(我尝试了两者,但似乎没有任何效果)。我更改了代码的某些部分以使其更容易使用,但是如果您想看一下原始源代码,可以查看它here。 (在原始源代码中,MDCheckboxes位于第143行。

非常感谢!

1 个答案:

答案 0 :(得分:1)

问题

活动的KivyMD MDCheckbox不会触发

on_active事件。

根本原因

动态类规则<ListItemWithCheckbox@OneLineAvatarIconListItem>:仅具有OneLineAvatarIconListItem的继承,而没有MDCheckbox的继承。因此,on_active处于活动状态时不会触发MDCheckbox事件,并且该事件被放错位置。

解决方案

  • 添加新的类属性,例如msg保留不同的文本。
  • 在实例化子项on_active下实施MDCheckbox:事件
  • 在实例化子级msg下将文本分配给ListItemWithCheckbox:

摘要

<ListItemWithCheckbox@OneLineAvatarIconListItem>:
    msg: ''
    MyAvatar:
        source: 'src/hdl.jpg'
    MyCheckbox:
        on_active: app.root.printS(root.msg)

...
                        ListItemWithCheckbox:
                            id: ckbx1
                            text: 'Box 1'
                            msg: 'Text 1'


                        ListItemWithCheckbox:
                            id: ckbx2
                            text: 'Box 2'
                            msg: 'Text 2'

                        ListItemWithCheckbox:
                            id: ckbx3
                            text: 'Box 3'
                            msg: 'Text 3'

输出

Result