Como iniciar a animação quando a propriedade é atualizada em kivy?

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

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

Foi útil?

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:

  1. 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 o Simple classe:

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

    1.3."Conectar-se" o id e o ObjectProperty:

    <Simple>:
       the_label: _the_label
    
  2. 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 outro Widget, neste caso RelativeLayout:

    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
    
  3. 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 do on_complete para o método inc.Observe também anim = 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

.

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

Animações de Kivy modificar propriedades específicas, e eu não acho que a animação texto realmente faz sentido neste contexto.

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top