如何使用Kivy Clock设置布尔标志时触发回调?

时间:2016-12-23 09:05:48

标签: python multithreading python-3.x kivy

我有一些代码在一个单独的线程上运行,我的主GUI线程依赖于该代码。我已经做了一个布尔标志来将作业标记为已完成,但是在设置该标志时我无法想出一种调用函数的方法。

像这样阻止主线程和应用程序冻结,这是我想要避免的:

while not flag:
    pass
callback()

使用Clock.idle()Clock.usleep(1)等号码代替pass也无效。 Kivy中有什么东西像Clock.schedule_once接受一个标志,在每个事件循环迭代中检查它并在True之后调用回调吗?

修改
这是标志设置的地方,是Class 1的一部分:

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

这里是Class 2,kivy.app.App子类,它具有Class 1的object属性并在循环中检查它的flag属性:

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

1 个答案:

答案 0 :(得分:0)

你可以这样设置标志。:

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

在你的App类中,有这样的东西:

YourAppClass(App):

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

    def myCallback(self,dt):
        # do something