Cómo iniciar la animación, cuando la propiedad se actualiza en kivy?

StackOverflow https://stackoverflow.com//questions/21019680

  •  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).

¿Fue útil?

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:

  1. 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 la Simple clase:

    class Simple(BoxLayout):
        the_label = ObjectProperty(None)
    

    1.3."Conectar" el id y el ObjectProperty:

    <Simple>:
       the_label: _the_label
    
  2. 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 otro Widget, en este caso RelativeLayout:

    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
    
  3. 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 la on_complete el método inc.También aviso anim = 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top