【问题标题】:How to switch a widget's Animation transition in Kivy如何在 Kivy 中切换小部件的动画过渡
【发布时间】:2019-01-20 18:58:12
【问题描述】:

总结:

我想测试 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()

【问题讨论】:

  • 它对我有效:imgur.com/a/zYourkg
  • @eyllanesc 感谢您的检查。该应用程序将打开并完美地完成第一个过渡;但是,通过单击背景按钮> on_release: base.change_transition(),应用程序将不会有另一个过渡。它的唯一工作方法是停止应用程序,将过渡名称复制并粘贴到transition = ,然后再次启动应用程序。
  • 我建议您再次阅读您的问题,因为您在评论中指出的内容与您在问题中描述的内容不一致。

标签: python animation kivy transition


【解决方案1】:

您的代码正在运行,但未达到您的预期。您的on_release 调用base.change_transition(),它指的是base id。 idKV 字符串中的一个LittleButtons,它不是由on_parent 事件构建的。那个LittleButtons的动画转场修改成功,其他不受影响。此外,那个特定的LittleButtons 是看不见的,因为大的Button 隐藏了它。因此,您成功更改了一个 LittleButtons 的转换,但它没有显示。

【讨论】:

  • 啊,我明白了。我将如何更改它以使所有按钮生效?
  • 一种方法是创建一个扩展FloatLayout 的类,并用它来替换KV 中的FloatLayout。为该新类提供 id: base 并在其中实现 change_transition() 方法。该方法将有一个循环更改其每个LittleButtons 子级的转换,然后为每个子级调用reup() 方法。
  • 这是有道理的。虽然,每个按钮都必须有其唯一的 id,而不是所有的 id 都为base,对吧?出于好奇,每个人如何获得自己的身份?我会用 +1 循环做类似base1base2... 的事情吗?
  • 他们不可能都拥有相同的id,而且每个人都有自己独特的id 并没有多大帮助。如果包含所有LittleButtonsWidget 有一个id,那么您可以拥有该容器的change_transition() 方法。该方法可以循环遍历容器的children 列表或使用walk() 方法访问每个LittleButtons。请参阅Widget documentation 了解更多信息。
猜你喜欢
  • 2013-01-19
  • 2011-12-03
  • 1970-01-01
  • 2022-01-08
  • 2014-10-20
  • 1970-01-01
  • 2021-01-14
  • 2019-10-16
  • 2023-03-29
相关资源
最近更新 更多