使用kivy时钟在执行前等待

时间:2017-12-24 13:37:44

标签: python kivy

我有一个从服务器获取的列表,这就是我想要做的事情

result = [1,7,0,0,2,4....]

def got_json(req, result):
    for i in result:
        if i is odd:
            wait for 5 seconds and call my_function
            now continue
        else:
            call my_function (now)

所以基本上我正在寻找更像time.sleep()但是使用time.sleep冻结应用程序,我只想在got_json方法中暂停执行for循环而不是我认为time.sleep所做的所有其他事情。

我尝试使用此代码使用Clock.schedule_once

class MyWidget(BoxLayout):

    def onbuttonclick(self):
        my_list = range(10)
        for i in my_list:
            if (i%2 == 0) :
                Clock.schedule_once(self.my_callback, 5)
                continue

            print("Whatever")

    def my_callback(self,dt):
        print("called")

输出似乎确实调度了函数,但它没有停止执行for循环,这就是我想要的 输出上述代码

Whatever
Whatever
Whatever
Whatever
Whatever
called
called
called
called
called

我希望输出

Whatever
**5 seconds**

called
Whatever
**5 seconds**

called 

依旧......
如何使用Clock对象来执行我想要的操作?感谢

2 个答案:

答案 0 :(得分:2)

这是一个有趣的问题。使用线程 - 对于像这样的任务一般来说是最通用的解决方案。但是,如果我们讨论这个具体情况,您可以使用generator并使用它的屈服点来返回自己的控制流并稍后使用<FlatList renderItem={(item, index)=>{ //add check on the basis of isEven = (index%2 ===0); <ListItem> <Body> <Text style={{fontSize: 10, fontWeight: 'bold'}}>Lead Info Update: Updated lead info bar . 2017-11-15 14:27:02</Text> <Text style={{fontSize: 15}} note><Icon style={{fontSize: 15}} name="calendar"/> 2017-11-15 14:28:44</Text> </Body> </ListItem>} } /> 恢复执行:

Clock.schedule_once

<强> UPD:

from functools import wraps

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.clock import Clock


def yield_to_sleep(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        gen = func()
        def next_step(*_):
            try:
                t = next(gen)  # this executes 'func' before next yield and returns control to you
            except StopIteration:
                pass
            else:
                Clock.schedule_once(next_step, t)  # having control you can resume func execution after some time
        next_step()
    return wrapper


@yield_to_sleep  # use this decorator to cast 'yield' to non-blocking sleep
def test_function():
    for i in range(10):
        if (i % 2 == 0):
            yield 5  # use yield to "sleep"
            print('Called')
        else:
            print('Whatever')


class TestApp(App):
    def build(self):
        test_function()
        return BoxLayout()


if __name__ == '__main__':
    TestApp().run()

答案 1 :(得分:1)

让on_json()启动一个线程,你现在在on_json中的代码就是线程的主体。只需在线程中使用time.sleep()即可。所以你的新线程会在需要时阻塞,但你的主应用却没有。