Kivy:como alterar o tamanho do widget usando propriedade numérica?
Pergunta
Tentando fazer um widget de tijolo mudar de tamanho cada vez que ele reaparece.
O arquivo py tem
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)
e o arquivo kv tem
<BrickGreen>:
size_hint: None, None
size: self.brickwidth, 25
canvas:
Color:
rgba: 0, 1, 0, 1
Rectangle:
pos: self.pos
size: self.size
Essencialmente, o nível 0 deveria ter tijolos com comprimento de 100, uma vez quebrado ele vai para o nível 1 e deveria gerar tijolos com comprimento de 75, mas fica em 100
Solução
BrickGreen.brickwidth = 100
Isso substitui NumericProperty no nível da classe pelo número 100.Você precisa definir o valor da largura do tijolo para instâncias de seus objetos, não das próprias classes.Neste caso, você poderia (por exemplo) passar a largura desejada para o seu spawn_brick
método e use-o ao instanciar o BrickGreen.
Você também precisa declarar NumericProperty no nível da classe, não dentro __init__
.
Sugiro ler a documentação do kivy sobre propriedades e examinar os exemplos para ver como elas devem ser usadas.