Kivy: не могу поставить BorderImage в указанной позиции - PullRequest
0 голосов
/ 01 февраля 2019

(1) При использовании следующей кв версии файла удалось разместить BorderImage виджет в указанной позиции ..

<Screen>:
    ProgressBar:
        max: 100
        pos_hint: {'top':0.86, 'x':0.01}
        size_hint_x: 0.49
        size_hint_y: 0.1
        canvas:
            BorderImage:
                border: (10, 10, 10, 10)
                pos: self.x, self.center_y
                size: self.width, 8
                source: '0.png'

(2) Но следующий код Pure Python , который должен реализовывать ту же функцию, что и (1), не работает должным образом. Виджет BorderImage расположен в нижней части 1015* экрана.pos_hint={'top':0.86,'x':0.01} не работает.Я думаю, что указание pos=(bar.x, bar.center_y) не очень хорошо, потому что значение bar.center_y отличается от кода (1).

class BarWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(BarWidget, self).__init__(**kwargs)
        self.build()
    def build(self):
        bar = ProgressBar(pos_hint={'top':0.86,'x':0.01}, max=100, size_hint_x=0.49, size_hint_y=0.1)
        with bar.canvas:
            BorderImage(border=(10, 10, 10, 10), pos=(bar.x, bar.center_y), size=(self.width/2, 8), source='0.png')
        self.add_widget(bar)

Как мне изменить bar.center_y?

(1): снимок экрана

(2): снимок экрана

1 Ответ

0 голосов
/ 02 февраля 2019

В языке kv, когда вы устанавливаете атрибут, такой как size: self.size, этот атрибут автоматически обновляется всякий раз, когда виджет 'self' меняет размер фигуры.Когда вещи загружаются в экран / макет, они начинаются с необычных позиций и размеров, а затем перемещаются, чтобы быть правильными.Поскольку все автоматически обновляется при изменении размеров / позиций, если вы работаете в kv, все работает так, как вы ожидаете.

В python вам необходимо явно связать некоторую функцию для обновления холста, если размер или положение виджета этонаследуя его размер и pos от изменений.Вы можете сделать это, используя функцию bind (доступна в большинстве / всех kivy виджетах).Используя bind, вы можете сказать bind(<attribute>=<function>), что означает, что каждый раз, когда <attribute>, или размер или виджет виджета изменяется, он вызывает <function>

Я не проверял это точно с вашим кодомпоскольку не все это опубликовано, но это то, что я делаю для своих проектов.Дайте мне знать, как это работает.Если это не сработает, отредактируйте свой ответ, чтобы он представлял собой фрагмент кода, с которым я могу скопировать / вставить, и я обновлю свой ответ.

class BarWidget(FloatLayout):
    def __init__(self, **kwargs):
        super(BarWidget, self).__init__(**kwargs)
        self.build()
    def build(self):
        # Make it so you can reference the bar and border image later
        self.bar = ProgressBar(pos_hint={'top':0.86,'x':0.01}, max=100, size_hint_x=0.49, size_hint_y=0.1)
        with self.bar.canvas:
            # Make it so you can reference the border image
            self.border_image = BorderImage(border=(10, 10, 10, 10), pos=(bar.x, bar.center_y), size=(self.width, 8), source='0.png')
        self.add_widget(self.bar)
        # Make it so whenever the widget's pos or size changes, we update the border image
        self.bar.bind(pos=self.update_border_image, size=self.update_border_image)
    # make a function to update border image
    def update_border_image(self, *args):
        self.border_image.size = (self.width, 8) # Should this 8 be 0.8 by the way?
        self.border_image.pos = (self.bar.x, self.bar.center_y)
...