Python Kivy - Настроить Эллипс на доступное пространство - PullRequest
0 голосов
/ 01 августа 2020

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

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 для высоты правильный, но Я не смог найти способ просто установить ширину круга на его высоту.

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

1 Ответ

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

Вот модифицированная версия вашего 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 хорошо работает только с одним дочерним элементом (дополнительные дочерние элементы будут нарисованы друг над другом).

...