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