Dynami c Классы в Kivy ... Мне все еще не хватает понимания ... Не работает, как я ожидал - PullRequest
0 голосов
/ 06 августа 2020

Мой файл Py:

    from kivymd.app import MDApp
    from kivymd.theming import ThemeManager
    from kivy.app import App
    from kivy.uix.video import Video
    

 class MainApp(MDApp):
        def on_start(self):
            # Set colors
            self.theme_cls = ThemeManager()
    
    MainApp().run()

Итак, это мой настраиваемый виджет:

<PagesButton@MDRectangleFlatButton>
    canvas:
        Color:
            rgba: 0, 0, 0, 1
        Line:
            width: 4
            ellipse: (self.x, self.y, 120, 120)

    BoxLayout:
        size_hint: None, None
        #pos_hint: {'center': .5, 'top': .5}
        width: 70
        height: 45

    Image:            
        size_hint: None, None
        size: 60, 60
        keep_ratio: False
        allow_stretch: True

и вот экземпляр указанного виджета, который я пытаюсь использовать,

        GridLayout:  
            cols: 10
            rows: 1
            size_hint_y:  None
            height: 150
            spacing: 60
            padding: 20, 60, 20, 0


            MDRectangleFlatButton:
                canvas:
                    Color:
                        rgba: 0, 0, 0, 1
                    Line:
                        width: 4
                        ellipse: (self.x, self.y, 120, 120)

                BoxLayout:
                    size_hint: None, None
                    #pos_hint: {'center': .5, 'top': .5}
                    width: 30
                    height: 25

                    Image:
                        source: "Nav_icons/Events.png"
                        size_hint: None, None
                        size: 60, 60
                        keep_ratio: False
                        allow_stretch: True
                        #pos_hint: {'left': .5, 'top': 1.1}


            PagesButton:
                text: 'hey'

Теперь, как я это понимаю ....

если я использую специальный класс Dynami c внутри своего кода, если он еще не имеет всех других свойств, которые я написал, когда я изначально определил класс?

В этом текущем примере, когда я пишу PagesButton, я получаю только обычную прямоугольную кнопку с текстом «привет» посередине. Все остальное, что я написал в PagesButton@MDRectangleFlatButton, полностью игнорируется.

enter image description here

My intention is to define a broad view class with all of the property definitions, and then use instances of this class over and over, with slight tweaks each time, such as a new image with new source, yet everything else in the broad class would still appear. In this example, i should be getting a stroked, circular button every single time i use the class, with a new image inside. I expect changes only if i define a new rule to that specific property each instance, otherwise, everything should be visually constant and consistent.

Is this not how its supposed to work? Or am I doing something wrong?

введите описание изображения здесь

1 Ответ

0 голосов
/ 07 августа 2020

Ваш класс Dynami c технически работает так, как вы описали. Экземпляр PagesButton будет иметь потомков, как вы определили в своем правиле kv. Проблема в том, что вы, похоже, делаете некоторые неверные предположения. В общем, Widget не контролирует положение или размер своих дочерних элементов. Среди них есть макеты. Таким образом, PagesButton рисуется так, как должно.

Из документации Widget :

  • Виджет не является макетом: он не изменится положение или размер его дочерних элементов. Если вы хотите контролировать позиционирование или размер, используйте макет.
  • Размер виджета по умолчанию (100, 100). Это изменяется только в том случае, если родительский элемент является макетом. Например, если вы добавите метку внутри кнопки, метка не будет наследовать размер или положение кнопки, потому что кнопка не является макетом: это просто еще один виджет.

Итак, поскольку по умолчанию pos из Widget равно (0,0), дочерние элементы вашего PagesButton будут нарисованы как (0,0).

Вы также не можете использовать size_hint или pos_hint для дочерних элементов PagesButton, поскольку эти подсказки обрабатываются макетами.

Не уверен, как именно должен выглядеть PagesButton, но рассмотрите возможность использования BoxLayout с MDRectangleFlatButton в качестве одного из его дочерних элементов. Вы можете создать класс Dynami c, который расширяет BoxLayout (или любой макет) и содержит Image и MDRectangleFlatButton.

...