Python Kivy - настроить Ellipse на доступное пространство

Я пытаюсь создать этот простой фон.
Вот что у меня получилось уже:

import kivy
kivy.require('1.11.1')

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout

class BaseLayout(BoxLayout):
    pass


class MyWindow(FloatLayout):
    def __init__(self, **kwargs):
        super(MyWindow, self).__init__(**kwargs)
        self.add_widget(BaseLayout())


class MyApp(App):
    # 'Global' Variables
    size_x = 220*1.3
    size_y = 250*1.3

    def build(self):
        return BaseLayout()


MyApp().run()

И мой .kv-файл:

#:kivy 1.11.1
#:import hex kivy.utils.get_color_from_hex

<BaseLayout>:
    orientation: "vertical"
    size: (app.size_x, app.size_y)
    size_hint: (None, None)

    #:set bg_color hex('#262626')
    #:set topBar_color hex('#1c1c1c')
    #:set bt_color hex('#4d4d4d')

    AnchorLayout:
        size_hint_y: .1

        Label:
            canvas.before:
                Color:
                    rgba: topBar_color
                Rectangle:
                    size: self.size
                    pos: self.pos

        AnchorLayout:
            anchor_x: 'right'
            anchor_y: 'center'
            padding: 10, 10

            Label:
                size_hint: (1, 1)
                # size: (25, 0)

                canvas.before:
                    Color:
                        rgba: bt_color
                    Ellipse:
                        pos: self.pos
                        size: self.size

    Label:
        size_hint_y: .9
        canvas.before:
            Color:
                rgba: bg_color
            Rectangle:
                size: self.size
                pos: self.pos

Я ищу способ, чтобы круг всегда адаптировался к высоте полосы вверху (и, конечно, это должен быть настоящий круг, а не растянутый эллипс, как сейчас).
Окно не предназначено нужно изменить размер, но я хочу иметь возможность управлять виджетом с помощью переменных size_x и size_y, поэтому я не могу просто ввести некоторые абсолютные значения.

Подсказка size_hint для высоты верна, но я не смог найти способ просто установить ширину круга на его высоту.

заранее спасибо


person Sir Teddy the First    schedule 01.08.2020    source источник


Ответы (1)


Вот модифицированная версия вашего kv:

#:kivy 1.11.1
#:import hex kivy.utils.get_color_from_hex

<BaseLayout>:
    orientation: "vertical"
    size: (app.size_x, app.size_y)
    size_hint: (None, None)

    #:set bg_color hex('#262626')
    #:set topBar_color hex('#1c1c1c')
    #:set bt_color hex('#4d4d4d')

    AnchorLayout:
        anchor_x: 'right'
        size_hint_y: .1
        canvas.before:
            Color:
                rgba: topBar_color
            Rectangle:
                size: self.size
                pos: self.pos
        Widget:
            size_hint: None, 1
            width: self.height
            canvas.before:
                Color:
                    rgba: bt_color
                Ellipse:
                    pos: self.pos
                    size: self.size

    Label:
        size_hint_y: .9
        canvas.before:
            Color:
                rgba: bg_color
            Rectangle:
                size: self.size
                pos: self.pos

Это использует Widget с size_hint: None, 1, чтобы сделать его высотой родителя, и позволяет установить width как width: self.height, чтобы сделать квадрат Widget. Нарисованный Ellipse с использованием этого размера будет кругом. Обратите внимание, что, как правило, AnchorLayout хорошо работает только с одним дочерним элементом (дополнительные дочерние элементы будут нарисованы друг над другом).

person John Anderson    schedule 01.08.2020