Планирование действий - PullRequest
0 голосов
/ 25 августа 2018

Я делаю приложение BlackJack, используя Kivy, мне нужно сделать что-то вроде delay или даже time.sleep, но, конечно, программа не должна зависать. Я видел, что у Киви есть Clock.whatever, чтобы запланировать определенные действия. То, что я хотел бы сделать, - это планирование нескольких действий, чтобы после завершения первого действия было выполнено второе, и так далее. Какой лучший способ достичь этого? или есть в модуле Clock что-то для выполнения нескольких задержек одна за другой?

Это может быть примером того, что мне нужно сделать:

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 голосов
/ 26 августа 2018

Во-первых, я удивлен, что ваш вопрос не получил отрицательного ответа, так как это не должно быть местом для вопросов мнения. Таким образом, вы не должны просить best.

В модуле Clock нет специального метода, чтобы делать то, что вы хотите. Obvioulsy, вы могли бы сделать список 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()

Это отдельная тема, поэтому вам не нужно беспокоиться о зависании вашего графического интерфейса. Вы передаете ему список функций, которые должны быть выполнены, список аргументов для этих функций и список задержек (для ожидания перед выполнением каждой функции). Обратите внимание, что использование 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 class __init__() может использовать дополнительные проверки, чтобы убедиться, что он не вызовет исключение при запуске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...