如何在Kivy中切换控件的动画转换

2024-10-02 14:27:26 发布

您现在位置:Python中文网/ 问答频道 /正文

小结:

我想测试Kivy的Animation函数的所有可能的转换。在

在我的代码中,我调用了一个方法来切换按钮的动画。方法被成功调用,因为我使用了print来确认更改;但是,按钮的转换不接受更改。在下一个动画列表中,他们不使用第一个动画。在

我做错什么了?在

代码:

from kivy.app import App
from kivy.core.window import Window
from kivy.lang import Builder
from random import random
from kivy.uix.button import Button
from kivy.animation import Animation
from kivy.clock import Clock


class LittleButtons(Button):

    transition = 'in_back'
    dur = 2
    num = 0

    def change_transition(self):

        list = ['in_back','in_bounce','in_circ','in_cubic','in_elastic','in_expo','in_out_back',
                'in_out_bounce','in_out_cubic','in_out_elastic','in_out_expo',
                'in_out_quad','in_out_quart','in_out_quint','in_out_sine','in_quad','in_quart',
                'in_quint','in_sine','linear','out_back','out_bounce','out_circ','out_cubic',
                'out_elastic','out_expo','out_quad','out_quart','out_quint','out_sine']

        self.num += 1
        self.transition = list[self.num]
        self.reup()
        print(self.transition)

        if self.num == len(list) - 1:
            self.num = -1

    def reup(self, *args):

        Animation.cancel_all(self)
        anim = Animation(pos_hint = {'center_x': random(), 'center_y': random()},
                         duration = self.dur, t = self.transition)
        anim.start(self)

    def __init__(self, **kwargs):

        super(LittleButtons, self).__init__(**kwargs)
        self.pos_hint = {'center_x': random(), 'center_y': random()}
        self.size_hint = None, None
        self.width = random() * (Window.width / 20)
        self.height = random() * (Window.width / 20)
        self.background_color = [0,0,0,.05]

        Animation(pos_hint = {'center_x': random(), 'center_y': random()},
                  duration = self.dur).start(self)
        Clock.schedule_interval(self.reup, self.dur)

KV = Builder.load_string("""
#:import Factory kivy.factory.Factory

Screen:
    FloatLayout:
        on_parent:
            (lambda ltext: [self.add_widget(Factory.LittleButtons(text=ltext)) for i in range (150)])('hi!')
        LittleButtons:
            id: base
        Button:
            background_color: 0,0,0,0
            canvas:
                Color:
                    rgba: 0,1,1,1
                Rectangle:
                    pos: self.pos
                    size:self.size
            on_release:
                base.change_transition()
""")

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

if __name__ == '__main__':
    MyApp().run()

Tags: infromposimportselfbackrandomout
1条回答
网友
1楼 · 发布于 2024-10-02 14:27:26

您的代码正在工作,但没有执行您期望的操作。您的on_release调用base.change_transition(),它引用了baseid。该id是您的KV字符串中的LittleButtons,它不是由on_parent事件生成的。其中一个LittleButtons的动画转换已成功修改,但其他的不受影响。另外,这个特殊的LittleButtons是看不见的,因为大的Button隐藏了它。所以,您成功地改变了一个LittleButtons的转换,但是它没有显示出来。在

相关问题 更多 >