Cómo iniciar la animación, cuando la propiedad se actualiza en kivy?
-
21-12-2019 - |
Pregunta
Este es mi 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()
Todo es trabajo, cada vez cuando el botón se presiona la etiqueta se actualiza por 5.
Lo que puedo agregar es que algunos de animación.Como:antes de la actualización número va a la izquierda, y cuando se actualiza el número proviene de la derecha.Si esta es la animación de complicado, los demás concepto son bienvenidos.
¿Cómo se puede hacer ?Miré la documentación, pero cada ejemplo es con la posición, no con la actualización del texto (o al menos lo que yo he encontrado).
Solución
@inclemente que es correcto.Yo no creo que sea posible para animar el texto directamente, sin embargo es posible animar la Etiqueta.También es posible concatenar animaciones (el operador '+') y utilizar el evento on_complete
de la animación a poner las cosas en el medio, como el aumento que usted está buscando.
Es simple, pero necesita algunos cambios en el código:
Usted necesita ser capaz de acceder a la
Label
desde Python:1.1.Añadir un
id
para la etiqueta:Label: id: _the_label
1.2.Añadir un
ObjectProperty
a laSimple
clase:class Simple(BoxLayout): the_label = ObjectProperty(None)
1.3."Conectar" el
id
y elObjectProperty
:<Simple>: the_label: _the_label
Asegúrese de que el
Label
tiene espacio para moverse a la izquierda o a la derecha.Una forma de hacerlo:2.1 Incrustar el
Label
en otroWidget
, en este casoRelativeLayout
:RelativeLayout: Label:
2.2 Definir un tamaño para el
Label
y en el centro es:size_hint: 0.3, 0.1 center_x: self.parent.width/2 center_y: self.parent.height/2
Ahora se puede proceder a crear el método que anima la
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: El
bind
a la izquierda de la animación de laon_complete
el método inc.También avisoanim = left + right
para concatenar las dos animaciones.También existe el operador*
para ejecutar en paralelo animaciones.
Aunque no es posible animar el texto directamente, algunas de las propiedades de la Etiqueta afecta de forma indirecta.Por ejemplo, font_size, color, etc.Aquí es un lista completa.Estoy seguro de que debe haber una manera de hackear el movimiento del texto a través de la animación de la padding
la propiedad, si usted realmente necesita para animar el texto.
El código final es aquí:
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()
Otros consejos
¿Cómo se puede hacer ?Miré la documentación, pero cada ejemplo es con la posición, no con la actualización del texto (o al menos lo que yo he encontrado).
Kivy animaciones de modificar las propiedades específicas, y no creo que la animación de texto en realidad tiene sentido en este contexto.
Suena como a obtener el comportamiento que se desea usted realmente necesita para agregar uno o más etiquetas cuyas posiciones son animados a conseguir el efecto de movimiento, es decir, la clase de Animación no permite animar una propiedad (de texto) por cambio de otros puntos de venta (pos), que se relaciona solamente con el cambio de una propiedad específica en una forma específica.
Si esta es la animación de complicado, los demás concepto son bienvenidos.
Si quería hacer esto, yo había hecho una mirada al uso de un Carrusel widget con dos etiquetas.El inc
método podría cambiar el texto de los actualmente ocultos de la etiqueta, a continuación, llamar el Carrusel método que cambia la actualidad visible widget.El Carrusel ya tiene una animación donde el primer widget se desliza mientras que el próximo diapositivas, por lo que sería necesario el cuidado de los detalles para usted.
Esto es bastante específico, aunque, el uso de Carrusel sólo pasa a funcionar bien para su problema en particular.Creo que la verdadera respuesta a tu pregunta es el hecho de que usted necesita para pensar acerca de cómo agregar más complejo comportamiento en el propio, porque no es un caso de la animación de una propiedad.