【问题标题】:Kivy animations in a loop循环中的 Kivy 动画
【发布时间】:2020-07-18 08:16:33
【问题描述】:

所以我有一个程序可以根据存储在 sql 数据库中的一些数据创建一堆 KivyMD 卡。 MDCards 被创建然后添加,程序的那部分循环直到没有更多的卡片可以添加。我想让卡片在添加时一张一张地淡入淡出,所以我为卡片的 opacity 属性设置了动画并将其放在循环中。但是这些卡片会一起动画,就好像它们是一个对象一样。这是该部分的代码

def load_list_entries(self):
    mycursor.execute(Remainder_selection)
    self.remainders = mycursor.fetchall()
    self.remainders_amount = len(self.remainders)
    Mainscreenvar = sm.get_screen("MainScreen")
    sep = 0
    for i in range(self.remainders_amount):
        self.remainder = MDCard(size = (Window.width - Window.width/10, '100dp'),
                                size_hint = (None, None),
                                color_bg = (0,0,0,0.5),
                                opacity = 0,
                                radius = (20,20,20,20),
                                pos_hint = {"center_x": .5},
                                pos = (0,str(-sep) + "dp"),
                                padding = (10,10,10,10),
                                name = str(self.remainders[i][0])
                           )
        self.remainder.bind(on_release = self.callback_function)
        self.element1 = RelativeLayout(size = self.remainder.size,
                                       )
        self.element2 = Label(text = self.remainders[i][1],
                              text_size = self.element1.size,
                              color = (1,1,1,1) if ThemeManager.theme_style == "Dark" else (0,0,0,1),
                              valign = "top",
                              padding = ("20dp","20dp"),
                              font_name = "Roboto-Black",
                              font_size = "30sp",
                              shorten = True,
                              shorten_from = "right", 
                           )
        self.element3 = Label(text = self.remainders[i][2],
                              text_size = self.element1.size,
                              color = (1,1,1,0.6) if ThemeManager.theme_style == "Dark" else (0,0,0,0.6),
                              padding = ("20dp","20dp"),
                              font_name = "Roboto-Regular",
                              font_size = "13sp",
                              shorten = True,
                              shorten_from = "right")
        sep = sep + self.remainder.height + 10
        self.element1.add_widget(self.element2)
        self.element1.add_widget(self.element3)
        self.remainder.add_widget(self.element1)
        Mainscreenvar.ids.Remaindercontainer.add_widget(self.remainder)
        anim1 = Animation(opacity = 1)
        anim1.start(self.remainder)

实际的动画部分是最后几行。我的信念是,首先我会创建一张卡片,将所有必要的部分添加到其中,然后将卡片添加到屏幕上,最后制作一张卡片的动画,然后从头开始再次重复该过程以制作下一张卡片。但是整个动画部分是一次性完成的。我该如何解决这个问题?

【问题讨论】:

    标签: python loops kivy kivy-language


    【解决方案1】:

    我的信念是,首先我会创建一张卡片,将所有必要的部分添加到其中,然后将卡片添加到屏幕上,最后制作一张卡片的动画,然后从头开始重复该过程以制作下一张卡。

    这是错误的,anim1.start 没有阻塞,所以在启动动画和实例化/添加下一个小部件之间没有间隙。

    不要使用循环,而是将动画的on_complete 绑定到运行下一个任务的函数。这将使动画完成并然后运行您的下一段代码。

    【讨论】:

    • 非常感谢您的想法。但是我的程序需要使用循环,因为我不知道必须运行多少次循环以及需要创建多少 MDCard。该数据由数据库提供。那么我还有其他方法可以做到这一点吗?感谢您的帮助
    • 你的程序不需要那个循环。正如我所描述的,您需要编写代码以按照您想要的时间执行操作。例如,您可以查询数据库以获取制作卡片的参数列表,然后在每次动画运行时使用Clock.schedule_once 从列表中创建下一个,直到列表为空。
    • 好的,知道了。非常感谢!
    猜你喜欢
    • 2022-06-19
    • 2019-07-30
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 2016-01-16
    • 1970-01-01
    相关资源
    最近更新 更多