【问题标题】:Python KivyMD: How is it possible to use on_active on MDCheckboxes?Python KivyMD:如何在 MDCheckboxes 上使用 on_active?
【发布时间】:2019-06-21 00:31:50
【问题描述】:

我目前在使用 MDCheckbox 时遇到了一些问题。当我使用默认的 Kivy Checkbox 时,kv 代码中的 on_active 参数似乎工作得很好。但是现在我正在尝试将 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 行。

非常感谢!

【问题讨论】:

    标签: python checkbox kivy kivy-language


    【解决方案1】:

    问题

    on_active 事件不会为活动的 KivyMD MDCheckbox 触发。

    根本原因

    动态类规则&lt;ListItemWithCheckbox@OneLineAvatarIconListItem&gt;:只继承OneLineAvatarIconListItem,不继承MDCheckbox。因此,on_active 事件不会在 MDCheckbox 处于活动状态时触发,而且该事件被放错了位置。

    解决方案

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

    片段

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

    输出

    【讨论】:

    • 非常感谢...与您的所有解决方案一样完美 xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 1970-01-01
    相关资源
    最近更新 更多