Kivy为一个特定类的所有对象设置动画

时间:2017-04-29 09:24:40

标签: kivy kivy-language

在kivy中有什么方法可以动画某些类的所有对象吗?我有kv代码,如:

<SomeLabel@Label>:
    size_hint_x = .5

MainBoxLayout:

    some_labels: [some_label1, some_label2, some_label3]

    BoxLayout:
        SomeLabel:
            id: some_label1
        SomeLabel:
            id: some_label2
        SomeLabel:
            id: some_label3

和Python代码:

class MainBoxLayout(BoxLayout):

    def animate_margins(self):
        for some_label in self.some_labels:
            Animation(size_hint_x=.1, d=.3, t='out_quint').start(some_label)

它看起来并不那么糟糕,但在实际程序中我有10个这样的标签,将来可能更多,所以我想知道是否有任何方法不分配这个ID并且只是动画所有某类的项目?

1 个答案:

答案 0 :(得分:0)

您可以在自制的自定义窗口小部件上创建一个静态列表,其中包含它的所有实例 这样做的一种方法是将它们附加到__init__方法中 在这个例子中,我制作了一个动画ToggleButton供你测试:

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.animation import Animation
from kivy.uix.boxlayout import BoxLayout


class SomeLabel(Label):
    instances = []
    def __init__(self, **kwargs):
        super(SomeLabel,self).__init__(**kwargs)
        SomeLabel.instances.append(self.proxy_ref)


class MainBoxLayout(BoxLayout):

    def animate_margins(self,state):
        x, d = (.1, .3) if state == 'down' else (1, 1)
        for some_label in SomeLabel.instances:
            Animation(size_hint_x=x, d=d, t='out_quint').start(some_label)


root = Builder.load_string('''

MainBoxLayout:

    BoxLayout:
        ToggleButton:
            text: 'Animate'
            on_release: root.animate_margins(self.state)
        SomeLabel:
            text: 'Label 1'
        SomeLabel:
            text: 'Label 2'
        SomeLabel:
            text: 'Label 3'


''')   


class MyApp(App):
    def build(self):
        return root


MyApp().run()