我正在使用Kivy制作BlackJack应用程序,我基本上需要制作一种delay
甚至是time.sleep
,但是当然,它不必冻结程序。我看到kivy有Clock.whatever
来安排某些动作。我想做的是安排多个动作,以便在第一个动作完成后运行第二个动作,依此类推。实现这一目标的最佳方法是什么?还是“时钟”模块中有一些东西可以一个接一个地执行多次延迟?
这可能是我需要做的一个例子:
from kivy.clock import Clock
from kivy.uix import BoxLayout
from functools import partial
class Foo(BoxLayout):
def __init__(self, **kwargs):
super().__init__(**kwargs)
for index_time, card in enumerate(cards, 1):
# Schedule this action to be run after 1 sec from the previous one and so on
Clock.schedule_once(partial(self.function, card), index_time)
def function(self, card, *args):
self.add_widget(card)
答案 0 :(得分:0)
首先,我很惊讶您的问题没有被否决,因为这不应该是提出意见问题的地方。因此,您不应该要求best
。
Clock
模块没有执行您想要的操作的特定方法。显然,您可以像示例代码那样列出Clock.schedule_once()
个调用。另一种方法是让每个函数安排其后继程序,但是假定将始终按该顺序调用这些函数。
无论如何,有很多方法可以做您想做的事情。我使用了类似以下的构造:
class MyScheduler(Thread):
def __init__(self, funcsList=None, argsList=None, delaysList=None):
super(MyScheduler, self).__init__()
self.funcs = funcsList
self.delays = delaysList
self.args = argsList
def run(self):
theLock = threading.Lock()
for i in range(len(self.funcs)):
sleep(self.delays[i])
Clock.schedule_once(partial(self.funcs[i], *self.args[i], theLock))
theLock.acquire()
这是一个单独的线程,因此您不必担心冻结gui。您向其传递要执行的功能列表,这些功能的参数列表以及延迟列表(用于在执行每个功能之前进行睡眠)。请注意,使用Clock.schedule_once()
计划在主线程上执行,并且并非所有功能都需要在主线程上执行。函数必须允许参数为Lock
对象,并且函数必须在完成后释放Lock
。像这样:
def function2(self, card1, card2, theLock=None, *args):
print('in function2, card1 = ' + str(card1) + ', card2 = ' + str(card2))
if theLock is not None:
theLock.release()
MyScheduler
类__init__()
方法可以使用更多检查,以确保运行时不会引发异常。