python - 当使用Kivy Clock设置 bool 标志时,如何触发回调?

标签 python multithreading python-3.x kivy

我有一些代码在单独的线程上运行,而我的主GUI线程取决于该代码。我已经创建了一个 bool 型标记来将作业标记为已完成,但是当该标记被设置时,我无法提出一种调用函数的方法。

诸如此类的东西阻塞了主线程,并且应用程序冻结了,这是我要避免的事情:

while not flag:
    pass
callback()

使用Clock.idle()Clock.usleep(1)之类的调用来代替pass也不起作用。 Kivy中是否有类似Clock.schedule_once的东西可以接受一个标志,在每次事件循环迭代时对其进行检查,并在它成为True时调用回调函数?

编辑
这是设置标志的地方,属于类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()

最佳答案

您可以在设置了标志的地方执行以下操作:

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

关于python - 当使用Kivy Clock设置 bool 标志时,如何触发回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41298315/

相关文章:

python - Cython 是用于构建 C 代码还是用于构建 Python 扩展?

python - 如果循环内满足条件,如何在 while 循环中并行调用函数?

python - Qmessagebox背景和文字颜色

python - 我想在代码上有一个 'else' 语句,使用 'for' 和 'if' 语句迭代列表以查找作为字典键的项目

python - "find_element_by_xpath"和 "driver.find_elements(By.XPATH)"有什么区别

Python 和 mySQL,INSERT 有效但 SELECT 返回 -1...!

c++ - condition_variable::wait_for 和 wait_until 使用 chrono::steady_clock 但在 PC sleep 时跳过持续时间?

java - 从运行方法/线程返回数据以更新 GUI

C# 杀死一个线程

python - `[row_index, [elements]]` 的嵌套列表到 Pandas 数据框?