Kivy: как изменить размер виджета с помощью числового свойства?

Попытка изменить размер виджета кирпича каждый раз, когда он возрождается.

В файле py есть

class Game(FloatLayout):
    player = ObjectProperty(None)
    playbutton = ObjectProperty(None)
    ratebutton = ObjectProperty(None)
    brickg = ObjectProperty(None)
    ballsin = NumericProperty(0)
    bricklist = ListProperty([])
    score = NumericProperty(0)
    switch = NumericProperty(0)
    level = NumericProperty(0)

     def __init__(self, *args, **kwargs):
        super(Game, self).__init__(*args, **kwargs)
        Clock.schedule_interval(self.update, 1./60)

    def spawn_brick(self, *args):
        b2 = BrickGreen(x=randint(50, self.width - 50), \
        y=randint(self.height - self.height / 4, self.height - (self.height/13)))
        self.bricklist.append(b2)
        self.add_widget(b2)

    def check_brick_spawn(self, *args):

        if len(self.bricklist) == 0:
            if self.level == 0:
                BrickGreen.brickwidth = 100
                self.spawn_brick()
            elif self.level == 1:
                BrickGreen.brickwidth = 75
                self.spawn_brick()
            else:
                BrickGreen.brickwidth = 50
                self.spawn_brick()

class BrickGreen(Widget):
    def __init__(self, **kwargs):
        super(BrickGreen, self).__init__(**kwargs)

        brickwidth = NumericProperty(0)

а в файле kv есть

<BrickGreen>:
    size_hint: None, None
    size: self.brickwidth, 25
    canvas:
        Color:
            rgba: 0, 1, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size

По сути, уровень 0 должен иметь кирпичи длиной 100, как только он сломается, он перейдет на уровень 1 и должен порождать кирпичи длиной 75, но он остается на уровне 100.


person FortuneFaded    schedule 04.06.2014    source источник


Ответы (1)


BrickGreen.brickwidth = 100

Это заменяет NumericProperty на уровне класса числом 100. Вам нужно установить значение Brickwidth для экземпляров ваших объектов, а не для самих классов. В этом случае вы можете (например) передать нужную ширину вашему методу spawn_brick и использовать ее при создании экземпляра BrickGreen.

Вам также необходимо объявить NumericProperty на уровне класса, а не внутри __init__.

Я предлагаю прочитать документацию kivy по свойствам и просмотреть примеры, чтобы увидеть, как их следует использовать.

person inclement    schedule 04.06.2014
comment
Отлично, спасибо ненастный. Это работает, но у меня сейчас проблема. Мяч будет сталкиваться только с частью виджета. Поэтому я установил длину виджета на 300, когда я добавляю его через функцию spawn_brick, но мяч будет сталкиваться только с шириной виджета около 100. - person FortuneFaded; 05.06.2014