在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并且只是动画所有某类的项目?
答案 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()