Como iniciar a animação quando a propriedade é atualizada em kivy?
-
21-12-2019 - |
Pergunta
Este é o meu código:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import NumericProperty
Builder.load_string('''
<Simple>:
Label:
text: str( root.sometext )
Button:
text: '+++'
on_release: root.inc()
''')
class Simple(BoxLayout):
sometext = NumericProperty(0)
def __init__(self, **kwargs):
super(Simple, self).__init__(**kwargs)
self.sometext = 5
def inc(self):
self.sometext += 5
class TApp(App):
def build(self):
return Simple()
TApp().run()
Tudo está funcionando, a cada momento em que o botão é prensas rótulo é atualizado por 5.
O que eu não vou adicionar alguns animação.Como:antes de actualizar o número vai para a esquerda, e quando atualizado número vem da direita.Se esta é a animação complicado, outras conceito são bem-vindas.
Como isso pode ser feito ?Eu olhei documentação, mas, cada exemplo é com posição, não com atualização do texto (ou pelo menos o que eu encontrei).
Solução
@mau é certo.Eu não acho que é possível animar o texto diretamente, no entanto, é possível animar o Rótulo.Também é possível concatenar as animações (operador '+') e usar o evento on_complete
da animação para colocar as coisas no meio como o incremento você está procurando.
É simples, mas você precisa de algumas alterações no código:
Você precisa ser capaz de acessar o
Label
a partir do Python:1.1.Adicionar um
id
para o rótulo:Label: id: _the_label
1.2.Adicionar um
ObjectProperty
para oSimple
classe:class Simple(BoxLayout): the_label = ObjectProperty(None)
1.3."Conectar-se" o
id
e oObjectProperty
:<Simple>: the_label: _the_label
Certifique-se de que o
Label
tem espaço para se mover para a esquerda ou para a direita.Uma maneira de fazê-lo:2.1 Incorporar o
Label
em outroWidget
, neste casoRelativeLayout
:RelativeLayout: Label:
2.2 Definir um tamanho para o
Label
e centro-lo:size_hint: 0.3, 0.1 center_x: self.parent.width/2 center_y: self.parent.height/2
Agora você pode continuar a criar o método que anima o
Label
:def animate(self): left = Animation(x=0, color= [0,0,0,0]) left.bind(on_complete=self.inc) right = Animation(center_x=self.the_label.parent.width/2, color= [1,1,1,1]) anim = left + right anim.start(self.the_label) def inc(self, instance, value): self.sometext += 5
Aviso: O
bind
para a esquerda animação doon_complete
para o método inc.Observe tambémanim = left + right
para concatenar duas animações.Há também o operador*
paralelamente animações.
Apesar de não ser possível, para animar o texto diretamente, algumas das propriedades do Rótulo afeta indiretamente.Por exemplo, font_size, cor, etc.Aqui é um lista completa.Eu sou positivo que deve haver uma maneira de hackear o movimento do texto, através da animação do padding
propriedade, se você realmente precisa para animar o texto.
O código final é aqui:
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
from kivy.properties import NumericProperty, ObjectProperty
from kivy.animation import Animation
Builder.load_string('''
<Simple>:
the_label: _the_label
RelativeLayout:
Label:
id: _the_label
size_hint: 0.3, 0.1
center_x: self.parent.width/2
center_y: self.parent.height/2
text: str( root.sometext )
Button:
text: '+++'
on_release: root.animate()
''')
class Simple(BoxLayout):
the_label = ObjectProperty(None)
sometext = NumericProperty(5)
def animate(self):
left = Animation(x=0)
left.bind(on_complete=self.inc)
right = Animation(center_x=self.the_label.parent.width/2)
anim = left + right
anim.start(self.the_label)
def inc(self, instance, value):
self.sometext += 5
class TApp(App):
def build(self):
return Simple()
TApp().run()
Outras dicas
.Animações de Kivy modificar propriedades específicas, e eu não acho que a animação texto realmente faz sentido neste contexto.Como isso pode ser feito? Eu parecia documentação, mas todo exemplo é com o posicionamento, não com atualização de texto (ou pelo menos o que eu encontrei).
Parece obter o comportamento que você quer que você realmente precise adicionar um ou mais rótulos cujas posições são animadas para obter o efeito de movimento - isto é, a classe de animação não permite animar uma propriedade (texto) mudando os outros (POS), apenas relaciona a alteração de uma propriedade específica de uma maneira específica.
.Se isso for animação complicado, outros conceitos são bem-vindos.
Se eu quisesse fazer isso, eu realmente olharia para usar um widget de carrossel com dois rótulos. O método inc
alteraria o texto do rótulo oculto atualmente, ligue para o método do carrossel que alterna o widget atualmente visível. O carrossel já tem uma animação em que o primeiro widget desliza enquanto os próximos deslizamentos, então ele cuidaria dos detalhes para você.
Isso é bem específico, porém, o uso de carrossel só acontece para funcionar bem para o seu problema particular. Eu acho que a resposta real à sua pergunta é o fato de que você precisa pensar em adicionar comportamento mais complexo por conta própria, porque não é um caso de apenas animar uma propriedade.