【问题标题】:Kivy: how to display a widget while waiting for another one to be displayed (both called from a same event)Kivy:如何在等待显示另一个小部件时显示一个小部件(都从同一个事件调用)
【发布时间】:2017-03-15 13:30:08
【问题描述】:

单击“确定按钮”时,我的 kivy 应用程序会检索有时包含 100 多个文件夹的列表,并显示每个文件夹 4 列和 1 行的 GridLayout。每行有 3 个可滚动标签和 1 个复选框。这个 GridLayout 有时需要将近 12 秒才能生成,所以我想同时显示一些东西(标签、图像......)。

尝试 1: 我的“确定按钮”调用 def DisplayTable。我试图简单地在 DisplayTable 的开头添加self.add_widget(Label_when_waiting)(所以在任何处理或生成 GridLayout 之前),但只有在显示 GridLayout 时才会显示Label_when_waiting。

尝试2:我试图将def DisplayTable分成两个def,Diplay_Label_when_waiting(由“确定按钮”调用的那个)和DisplayTable:

def Diplay_Label_when_waiting(self, *args):
    self.add_widget(Label_when_waiting)
    DisplayTable(self, *args)

但这里又一次,Label_when_waiting 仅在显示 GridLayout 时才显示。

那么我如何在 GridLayout 之前显示 Label_when_waiting 知道两个显示都必须由“确定按钮”触发

【问题讨论】:

    标签: python widget kivy


    【解决方案1】:

    在标签显示后使用Clock.schedule_once显示Grid:

    def Diplay_Label_when_waiting(self, *args):
        self.add_widget(Label_when_waiting)
        Clock.schedule_once(lambda dt: DisplayTable(self, *args), 0)
    

    您也可以使用 kivyoav 中的 delayable(免责声明 - 我是作者...)

    from kivyoav.delayed import delayable
    
    @delayable
    def Diplay_Label_when_waiting(self, *args):
        self.add_widget(Label_when_waiting)
        yield 0.0 # delay of 0ms , will cause the UI to update...
        DisplayTable(self, *args)
    

    【讨论】:

    • 非常感谢,这正在工作。感谢这个模块,我明天会尝试它我不明白为什么它与时钟一起工作,而不是当我直接调用定义时。为什么要使用时钟?
    • 让kivy事件循环时间更新屏幕
    • 感谢 Yoav 的回答。我仍然很困惑,如果只是为了给时间更新屏幕,为什么time.sleep 不起作用(此代码不显示标签:self.add_widget(Label_when_waiting) time.sleep(5) self.DisplayTable(self))
    • 因为 主事件循环线程 卡在 sleep call - 换句话说,事件循环正在等待您的函数结束,它不管你是睡觉还是做真正的工作,如果函数不返回事件循环就会卡住。
    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 2020-11-07
    • 2017-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多