Как вызвать обратный вызов, когда логический флаг устанавливается с помощью часов Kivy?



У меня есть некоторый код, работающий в отдельном потоке, и мой основной поток GUI зависит от этого кода. Я сделал логический флаг, чтобы отметить работу как выполненную, но я не могу придумать способ вызова функции, когда этот флаг устанавливается.



Что-то вроде этого блокирует основной поток и приложение зависает, чего я хочу избежать:



while not flag:
pass
callback()


Использование вызовов типа Clock.idle() или Clock.usleep(1) вместо pass также не сработало. Есть ли в Kivy что-то вроде Clock.schedule_once, что принимает флаг, проверяет его на каждой итерации цикла событий и вызывает обратный вызов, как только он True?



EDIT

Именно здесь устанавливается флаг, часть класса 1:



async def prepare(self):
# heavy computations...
self.flag = True


И вот класс 2, подкласс kivy.app.App, который имеет свойство объекта класса 1 и проверяет его свойство flag в цикле:



def action(self):
# start the `prepare` method here
while not self.obj.flag:
pass
proceed()
577   1  

1 ответ:

Вы можете сделать это, когда флаг установлен.:

def prepare(self):
    # heavy computations...
    self.flag = True
    YourAppClass.startClock()

И в вашем классе приложений, что-то вроде этого:

YourAppClass(App):

    def startClock(self):
        Clock.schedule_once(self.myCallback,0) # run clock thread next frame

    def myCallback(self,dt):
        # do something

Comments

    Ничего не найдено.