首页 > 解决方案 > 相当于 Kivy/KivyMD 中的 `wx.CallLater()` 或者如何处理 `time.sleep()` 冻结 GUI?

问题描述

我正在尝试使用KivyMD/制作一个应用程序Kivy,并且我想多次更改标签的文本,更改之间有几秒钟的间隔。我最初尝试使用 来执行此操作time.sleep(),但这完全冻结了 GUI,导致标签更改等不起作用。

我已经看到它wxPython具有wx.CallLater()(如果我理解正确的话)将在一段时间内调用某个函数而不会冻结 GUI 的函数。在这个线程中,人们在谈论线程,但它似乎在没有解决最初的问题的情况下引发了另一个问题,所以我真的不确定这是否适用于我的情况。

那么线程是要走的路,是否有等效的wx.CallLater()in Kivy,还是有另一种更好的解决方案来解决我的问题?

工作测试代码:

from kivymd.app import MDApp
from kivy.lang import Builder
import time

KV = '''
MDScreen:

    MDFillRoundFlatIconButton:
        id: button
        icon: 'git'
        on_release: app.some_func()
'''


class Test(MDApp):
    def build(self):
        return Builder.load_string(KV)

    def some_func(self):
        for i in range(3):
            self.root.ids.button.text = str(3 - i)
            time.sleep(3)

        self.root.ids.button.text = 'Go'


Test().run()

标签: pythonmultithreadinguser-interfacekivysleep

解决方案


正如@John Anderson所建议的那样,Clock来自的对象kivy.clock具有与wx.CallLater().

from kivy.clock import Clock

# to schedule an event once:
Clock.schedule_once(lambda _: some_function(), in_x_seconds)

# to schedule an event repeatedly:
Clock.schedule_interval(lambda _: some_function(), every_x_seconds)

推荐阅读