Python 基维:返回动画gif,然后调用另一个def

Python 基维:返回动画gif,然后调用另一个def,python,kivy,animated-gif,Python,Kivy,Animated Gif,点击一个按钮后,应用程序应该显示一个非常沉重的表格,所以我想先显示一个动画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可以工作,但不会调用Dis

点击一个按钮后,应用程序应该显示一个非常沉重的表格,所以我想先显示一个动画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,然后继续使用th 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呢

以下是生成器和加载类:


代码是

您需要让事件循环时间来更新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_更新UI一次


谢谢你。我可以通过你的插拔获得动画gif,但它运行不平稳。创建表格大约需要15秒:gif动画大约2秒,然后卡住大约8秒,然后缓慢移动2秒,最后3秒再次卡住。在15秒内,我的代码正在构建一个BoxLayout,其中有许多行,每个行包含几个可滚动的标签。整个BoxLayout本身是可滚动的。之后,我立即将BoxLayout添加到应用程序中,因此我不明白为什么.gif大部分时间都会卡住。如果没有代码,我将很难提供帮助,您是否尝试将收益率放在更多的地方?也许对于你的建筑中的每个单元来说?是的,这是更好的,但是现在.gif文件有时会返回,而且与15秒前相比,许多文件的输出速度实际上会减慢程序3分钟以上。我把密码放在了。FoldersManager.py中的相关部分是3.5和anim_gif。您的收益率是0.1还是0.0?这会产生巨大的速度差异,产量为0.0和0.1,在没有产量的情况下显示表格需要3分钟,需要15秒。你知道怎么解决吗?
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 ...
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()