Wie starte ich die Animation, wenn die Eigenschaft in Kivy aktualisiert wird?

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

  •  21-12-2019
  •  | 
  •  

Frage

Das ist mein Code:

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

Alles funktioniert, jedes Mal, wenn eine Taste gedrückt wird, wird die Beschriftung um 5 aktualisiert.

Was ich hinzufügen möchte, ist eine Animation.Wie:vor der Aktualisierung geht die Nummer nach links, und wenn die aktualisierte Nummer kommt, kommt sie von rechts.Wenn die Animation kompliziert ist, sind andere Konzepte willkommen.

Wie kann es gemacht werden?Ich habe mir die Dokumentation angesehen, aber jedes Beispiel bezieht sich auf die Position, nicht auf die Textaktualisierung (oder zumindest auf das, was ich gefunden habe).

War es hilfreich?

Lösung

@inclement hat recht.Ich glaube nicht, dass es möglich ist, den Text direkt zu animieren, aber es ist möglich, das Etikett zu animieren.Es ist auch möglich, Animationen zu verketten (Operator '+') und verwenden Sie das Ereignis on_complete der Animation, um Dinge wie die gewünschte Inkrementierung in die Mitte zu platzieren.

Es ist einfach, aber Sie benötigen ein paar Änderungen im Code:

  1. Sie müssen darauf zugreifen können Label von Python:

    1.1.Fügen Sie eine hinzu id zum Etikett:

    Label:
        id: _the_label
    

    1.2.Fügen Sie eine hinzu ObjectProperty zum Simple Klasse:

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

    1.3.„Verbinden“ Sie die id und das ObjectProperty:

    <Simple>:
       the_label: _the_label
    
  2. Stellen Sie sicher, dass Label hat Platz, um sich nach links oder rechts zu bewegen.Eine Möglichkeit:

    2.1 Einbetten des Label in eine andere Widget, in diesem Fall RelativeLayout:

    RelativeLayout:
       Label:
    

    2.2 Definieren Sie eine Größe für die Label und zentriere es:

    size_hint: 0.3, 0.1
    center_x: self.parent.width/2
    center_y: self.parent.height/2
    
  3. Jetzt können Sie mit der Erstellung der Methode fortfahren, die das animiert 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 
    

    Beachten: Der bind links Animation des on_complete zur Methode Inc.Beachten Sie auch anim = left + right um die beiden Animationen zu verketten.Es gibt auch den Betreiber * um parallele Animationen auszuführen.

Auch wenn es nicht möglich ist, den Text direkt zu animieren, wirken sich einige Eigenschaften des Labels indirekt darauf aus.Zum Beispiel Schriftgröße, Farbe usw.Hier ist ein vollständige Liste.Ich bin mir sicher, dass es eine Möglichkeit geben sollte, die Bewegung des Textes durch die Animation des zu hacken padding Eigentum, wenn Sie den Text wirklich animieren müssen.

Der endgültige Code ist hier:

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

Andere Tipps

Wie kann es gemacht werden?Ich habe mir die Dokumentation angesehen, aber jedes Beispiel bezieht sich auf die Position, nicht auf die Textaktualisierung (oder zumindest auf das, was ich gefunden habe).

Die Animationen von Kivy verändern bestimmte Eigenschaften, und ich glaube nicht, dass die Animation von Text in diesem Zusammenhang tatsächlich Sinn macht.

Es hört sich so an, als müssten Sie, um das gewünschte Verhalten zu erzielen, tatsächlich eine oder mehrere Beschriftungen hinzufügen, deren Positionen animiert sind, um den Bewegungseffekt zu erzielen. Das heißt, mit der Animationsklasse können Sie nicht eine Eigenschaft (Text) animieren, indem Sie andere ändern (pos), es bezieht sich nur auf die Änderung einer bestimmten Eigenschaft auf eine bestimmte Weise.

Wenn die Animation kompliziert ist, sind andere Konzepte willkommen.

Wenn ich das tun wollte, würde ich tatsächlich ein Karussell-Widget mit zwei Beschriftungen verwenden.Der inc Die Methode würde den Text der aktuell ausgeblendeten Beschriftung ändern und dann die Carousel-Methode aufrufen, die das aktuell sichtbare Widget wechselt.Das Karussell verfügt bereits über eine Animation, bei der das erste Widget weggleitet, während das nächste weitergleitet, sodass es sich um die Details für Sie kümmert.

Dies ist jedoch ziemlich spezifisch, da die Verwendung von Carousel für Ihr spezielles Problem einfach gut funktioniert.Ich denke, die eigentliche Antwort auf Ihre Frage ist die Tatsache, dass Sie darüber nachdenken müssen, selbst komplexeres Verhalten hinzuzufügen, da es nicht darum geht, nur eine Eigenschaft zu animieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top