Kivy поведение рисования на холсте, чтобы изменить его фон

Я пытаюсь установить фон моего макета на следующем языке kv:

<RootWidget>:

    Menu:
        orientation: 'vertical'

        Button:
            text: 'btn1'
            on_release: print('btn1')
        Button:
            text: 'btn'
            on_release: print('btn2')

    BoxLayout:
        BoxLayout:
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size
                    source: 'main_background.png'

            ToggleMenuButton:
                on_release: root.toggle_state()
                size_hint: None, None
                size: 60, 60
                background_color: 0, 0, 0, 0
                Image:
                    size: self.parent.size
                    pos: self.parent.pos
                    allow_stretch: True
                    source: './data/images/white_menu.png'

И это мой код:

from kivy.app import App
from kivy.garden.navigationdrawer import NavigationDrawer
from layouts.menu import Menu
from layouts.menu import ToggleMenuButton
from layouts.content import Content


class RootWidget(NavigationDrawer):
    pass


class MainApp(App):
    def build(self):
        self.root = RootWidget()
        return self.root


if __name__ == '__main__':
    MainApp().run()

Классы Menu и Content — это Kivy BoxLayout, ToggleMenuButton — это Kivy Button.

Когда я запускаю этот код, я получаю следующий экран:

неверное изображение

Фон должен быть моим изображением, а не черным. Если я использую white_menu.png в качестве фона, я также получаю черный фон. Но, если поставить следующий код:

    BoxLayout:
        orientation: 'vertical'
        BoxLayout:
            orientation: 'vertical'
            canvas.before:
                Rectangle:
                    pos: self.pos
                    size: self.size
                    source: 'main_background.png'

Я получаю следующее: изображение меню

Как вы можете заметить внизу, изображение прозрачное, с 3 белыми прямоугольниками, но на основном макете изображение красное. Я знаю, что он красный, потому что код rgba, но почему изображение меняет свой цвет? Если поставить фон на canvas.after работает корректно, свой фон вижу, а вот виджеты не вижу.

Подводя итог, хочется понять, что происходит? Почему я не вижу изменений на canvas.before? Почему/как добавление цвета на мой холст меняет мое изображение?

Если я изменю RootWidget на BoxLayout вместо NavigationDrawer, он будет работать правильно. Почему? Почему изменение холста дочернего элемента дочернего элемента NavigationDrawer не работает?


person Caaarlos    schedule 20.11.2016    source источник