В языке 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)