Wie starte ich die Animation, wenn die Eigenschaft in Kivy aktualisiert wird?
-
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).
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:
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
zumSimple
Klasse:class Simple(BoxLayout): the_label = ObjectProperty(None)
1.3.„Verbinden“ Sie die
id
und dasObjectProperty
:<Simple>: the_label: _the_label
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 andereWidget
, in diesem FallRelativeLayout
: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
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 deson_complete
zur Methode Inc.Beachten Sie auchanim = 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.