0

我正在尝试在首次加载应用程序时启动动画。加载屏幕关闭后立即使用 IE。我已经厌倦了“on_enter”事件,但它似乎不起作用,任何帮助将不胜感激。

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.animation import Animation
from kivy.properties import ListProperty
from kivy.core.window import Window
from random import random
from kivy.graphics import Color, Rectangle

Builder.load_string('''
<Root>:
AnimRect:
    pos: 500, 300
<AnimRect>:
on_enter: self.start_animation
canvas:
    Color:
        rgba: 0, 1, 0, 1
    Rectangle:
        pos: self.pos
        size: self.size
''')

class Root(Widget):
pass

class AnimRect(Widget):
    def anim_to_random_pos(self):
        Animation.cancel_all(self)
        random_x = random() * (Window.width - self.width)
        random_y = random() * (Window.height - self.height)

        anim = Animation(x=random_x, y=random_y,
                     duration=4,
                     t='out_elastic')
        anim.start(self)

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.anim_to_random_pos()

    def start_animation(self, touch):
        if self.collide_point(*touch.pos):
             self.anim_to_random_pos()

runTouchApp(Root())

打印错误画面

4

2 回答 2

0

它看起来像你想要的吗?

我刚刚删除了您 kv 中的“on_enter”行,并更正了您的缩进。

from kivy.base import runTouchApp
from kivy.lang import Builder
from kivy.uix.widget import Widget
from kivy.animation import Animation
from kivy.properties import ListProperty
from kivy.core.window import Window
from random import random
from kivy.graphics import Color, Rectangle

Builder.load_string('''
<Root>:
    AnimRect:
        pos: 500, 300
<AnimRect>:
    canvas:
        Color:
            rgba: 0, 1, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size
''')

class Root(Widget):
    pass

class AnimRect(Widget):
    def anim_to_random_pos(self):
        Animation.cancel_all(self)
        random_x = random() * (Window.width - self.width)
        random_y = random() * (Window.height - self.height)

        anim = Animation(x=random_x, y=random_y,
                     duration=4,
                     t='out_elastic')
        anim.start(self)

    def on_touch_down(self, touch):
        if self.collide_point(*touch.pos):
            self.anim_to_random_pos()

    def start_animation(self, touch):
        if self.collide_point(*touch.pos):
             self.anim_to_random_pos()

runTouchApp(Root())
于 2016-11-15T15:59:46.810 回答
0

on_enter方法是在 中定义的Screen,而不是在Widget. 你应该把那个矩形放在一个屏幕上(Root这里的小部件应该是一个屏幕),一旦屏幕的on_enter事件触发,就启动矩形动画。

另外,你叫错了;函数调用应该包含括号,即on_enter: self.start_animation()

于 2016-09-12T17:42:41.980 回答