【问题标题】:Kivy: returning animated gif and then calling another defKivy:返回动画 gif,然后调用另一个 def
【发布时间】:2017-03-22 14:47:07
【问题描述】:

点击按钮后,应用程序应该显示一个很重的表格,所以我想先显示一个动画gif,然后再显示表格。

当按钮被点击时,第一个 def 被调用:

wait_image= Loading()
self.add_widget(wait_image)
Clock.schedule_once(lambda x: self.DisplayTable(self), 0)

但这只会加载动画gif 的第一帧。如果我将 Clock.schedule 替换为 return self,则动画 gif 有效,但不会调用 DisplayTable def:

wait_image= Loading()
self.add_widget(wait_image)
return self

我尝试调用另一个将返回 self 的 def,然后继续使用 DisplayTable 但这也不起作用(.gif 没有动画但显示了表格):

Loading_image(self)
Clock.schedule_once(lambda x: self.DisplayTable(self), 0)

与:

def Loading_image(self):
    wait_image= Loading()
    self.add_widget(wait_image)
    return self

那么我怎样才能通过简单的点击,调用并显示一个动画 gif,然后继续调用 DisplayTable def?


这是BuilderLoading 类:

Builder.load_string('''
<Loading>
    source : 'loading.zip'
    anim_delay : 0.02
    allow_stretch : True
    keep_ratio : True
    keep_data : True
''')
class Loading(AsyncImage):
    pass

代码是here

【问题讨论】:

    标签: python kivy animated-gif


    【解决方案1】:

    您需要让事件循环有时间更新您的 gif...使用 kivyoav 让事情变得简单:

    from kivyoav.delayed import delayable
    
    @delayable
    def DisplayTable(self):
        for i in ROWS:
            yield 0.01 # after each row the gif will have time to update ... 
            for j in COLS:
                pass # build your table cols ...
    

    另一种选择是在不同的线程中完成繁重的工作,稍后仅使用 Clock.schedule_once

    更新 UI
    def build_table():
       ...
       #stuff that take time
       stuff = ...
       ...
       Clock.schedule_once(lambda dt: build_ui_table(stuff)) #since you can use the UI only from the main thread
    threading.Thread(target=build_table).start()
    

    【讨论】:

    • 感谢 Yoav。我可以通过您的插件获得动画 gif,但运行不顺畅。创建表格大约需要 15 秒:gif 动画大约 2 秒,然后卡住大约 8 秒,然后缓慢移动 2 秒,然后在最后 3 秒再次卡住。在 15 秒内,我的代码正在构建一个 BoxLayout,其中包含许多行,每行包含多个可滚动标签。整个 BoxLayout 本身是可滚动的。之后,我立即将 BoxLayout 添加到应用程序中,所以我不明白为什么 .gif 大部分时间都会卡住。
    • 如果没有代码,我将很难提供帮助,您是否尝试将 yield 放在更多地方? (也许对于您建筑物的每个单元格?)
    • 是的,这更好,但现在 .gif 有时会返回,而且许多产量确实会减慢程序的速度(与之前的 15 秒相比超过 3 分钟)。我把代码放在github.com/EnoraNedelec/FoldersManager。相关部分是FoldersManager.py中的##3##5#anim_gif
    • 您的产量是 0.1 还是 0.0?这可以产生巨大的速度差异
    • 在 yield 0.0 和 yield 0.1 的情况下,表格需要 3 分钟才能显示(没有 yield,需要 15 秒)。知道如何解决吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 2021-07-21
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多