Правильно используйте Kivy Canvas в Python - PullRequest
0 голосов
/ 09 мая 2020

Предполагая, что я определяю BoxLayout, но хочу добавить к нему, скажем, синий фон, в Kivy это будет выглядеть примерно так:

BoxLayout:
    canvas.before:
        Color:
            rgb: 0, 0, 1
        Rectangle:
            size: self.size
            pos: self.pos

Я пытался сделать это в Python как это:

box = BoxLayout()
with box.canvas.before:
    Color(rgb=(0, 0, 1))
    Rectangle(size=box.size, pos=box.pos)

Это рисует прямоугольник, но не правильного размера или положения. Мой вопрос: есть ли способ создать Rectangle (или другой способ добавить фон к BoxLayout) того же размера и положения, что и определенный BoxLayout? Самое близкое, что я когда-либо получал, - это физическая установка размера и формы, но я бы хотел, чтобы этот Rectangle имел динамическое изменение размера, чтобы у меня не было слишком много жестко закодированных значений. Заранее спасибо!

1 Ответ

1 голос
/ 10 мая 2020

Обычно этот код появляется в каком-либо методе класса, поэтому ссылку на Rectangle можно сохранить как, например, self.bg. Значит, хотелось бы что-то вроде этого:

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

        self.box = BoxLayout(size_hint=(0.5, 0.5))
        with self.box.canvas.before:
            Color(rgba=(1, 0, 0, 1))
            self.bg = Rectangle(pos=self.pos, size=self.size)

        # bindings to keep size and position of the Rectangle up to date
        self.box.bind(pos=self.update_bg)
        self.box.bind(size=self.update_bg)

        # add box to this layout
        self.add_widget(self.box)

     def update_bg(self, *args):
         self.bg.pos = self.box.pos
         self.bg.size = self.box.size
...