Python KivyMD: как можно использовать on_active на MDCheckboxes? - PullRequest
0 голосов
/ 21 июня 2019

В настоящее время я сталкиваюсь с некоторыми проблемами с MDCheckbox. Когда я использовал установленный по умолчанию флажок Kivy, параметр on_active в коде kv, казалось, работал довольно хорошо. Но сейчас я пытаюсь использовать модуль KivyMD MDCheckbox с MDList и пытаюсь добавить функцию в флажок с помощью параметра on_active:

Часть кода КВ

#: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. Я попытался установить параметр active с логическим значением True / False (я пробовал оба варианта, но ничего не получалось). Я изменил некоторые части кода, чтобы вам было легче, но если вы хотите взглянуть на исходный код, вы можете увидеть его здесь . (В оригинальном исходном коде MDCheckboxes находятся на линии 143.

Большое спасибо заранее!

1 Ответ

1 голос
/ 21 июня 2019

Задача

on_active Событие не запускается для активного KivyMD MDCheckbox.

Основная причина

Правило динамического класса, <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

...