计划动作

时间:2018-08-25 10:13:35

标签: python-3.x kivy

我正在使用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)

1 个答案:

答案 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__()方法可以使用更多检查,以确保运行时不会引发异常。