我有一个从服务器获取的列表,这就是我想要做的事情
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
对象来执行我想要的操作?感谢
答案 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()即可。所以你的新线程会在需要时阻塞,但你的主应用却没有。