Как переключить переход анимации виджета в Kivy - PullRequest
0 голосов
/ 20 января 2019

Резюме:

Я хотел бы проверить все возможные переходы функции 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()

1 Ответ

0 голосов
/ 21 января 2019

Ваш код работает, но не выполняет то, что вы ожидаете.Ваш on_release вызывает base.change_transition(), что относится к идентификатору base.id - это строка LittleButtons в вашей строке KV, которая не создана событием on_parent.Анимационный переход этого LittleButtons успешно изменен, но другие не затронуты.Кроме того, этот конкретный LittleButtons невидим, поскольку большой Button скрывает его.Итак, вы успешно меняете переход одного LittleButtons, но он не отображается.

...