Запуск последовательных наборов анимаций в tkinter с перерывом между ними - PullRequest
0 голосов
/ 04 июля 2019

Графический макет

Привет, мой первый пост здесь! Я впервые кодер, пытающийся выяснить проблему. Любая помощь очень ценится.

Я пытаюсь создать «анимацию», меняя цвета фона («мерцание») из четырех меток. Таким образом, идея состоит в том, чтобы он мигнул пару раз подряд, а затем сделал паузу, чтобы принять ввод пользователя. Этот пользовательский цикл ввода анимации повторяется пару раз.

Я пытался использовать метод after для этого. Но вместо того, чтобы анимировать последовательно, все в конечном итоге сжимается и работает вместе. Другими словами, если я пытаюсь выполнить последовательную анимацию, анимация в первый раз не выполняется до перехода к следующей анимации

В этом разделе создается последовательность анимации.

    self.genRandom(3)  # generate random sequence of numbers
    self.createSchedule(3) #relate the random sequence onto image on screen
    self.doanim() #execute animation 


    self.delay=10000  #delay before beginning next animation 
    self.after(self.delay, self.genRandom(3))
    self.after(self.delay, self.createSchedule(3))
    self.after(self.delay, self.doanim())

генерация расписания (связывает порядковый номер с изображениями) (задержка, функция изменения цвета метки)

def createSchedule(self,seqn):
    self.schedule.clear()
    tuple=(2000, self.labelbegin)
    self.schedule.append(tuple)
    #     (10, lambda: self.associateDigLogo())
    for number in self.listSeqn:
        #     (10, lambda: self.associateDigLogo()
        if number == 0:
            self.schedule.extend(((1000,lambda: self.buttonpresswhatsapp(None)), (500, lambda: self.buttonreleasewhatsapp(None))))
        elif number == 1:
            self.schedule.extend(((1000, lambda: self.buttonpressslack(None)), (500, lambda: self.buttonreleaseslack(None))))
        elif number == 2:
            self.schedule.extend(((1000, lambda: self.buttonpressskype(None)), (500, lambda: self.buttonreleaseskype(None))))
        elif number ==3:
            self.schedule.extend(((1000, lambda: self.buttonpresssnapchat(None)), (500, lambda: self.buttonreleasesnapchat(None))))

в этом разделе выполняется анимация

def doanim(self):

    if len(self.schedule) <= 0:
        return
    self.sched_item = 0

    s = self.schedule[self.sched_item]
    #run the function stored in the schedule
    print(s[0])
    self.after(s[0], self.doanim_helper)


def doanim_helper(self):

    s = self.schedule[self.sched_item]
    # run the function stored in the schedule
    s[1]()

    self.sched_item += 1
    print(self.sched_item)

    if self.sched_item >= len(self.schedule):
        self.after(1000, self.quit)
    else:
        s = self.schedule[self.sched_item]
        self.after(s[0], self.doanim_helper)

образец графических функций, названных выше

def buttonpresswhatsapp(self, event):
    self.whatsapplabel.config(bg="red")

def buttonreleasewhatsapp(self, event):
    self.whatsapplabel.config(bg="white")

1 Ответ

0 голосов
/ 04 июля 2019

По документам , когда функции передаются аргументы,

Все выражения аргументов оцениваются до попытки вызова

Следовательно, в self.after(self.delay, self.genRandom(3)) вызов функции self.genRandom(3) оценивается немедленно , затем его возвращаемое значение передается в self.after. Вот почему «все забито», без ожидаемой задержки.

Вместо этого вы хотите передать вызываемый объект (например, объект функции) в качестве второго аргумента:

self.after(self.delay, lambda: self.genRandom(3))
self.after(self.delay, lambda: self.createSchedule(3))
self.after(self.delay, self.doanim)

self.genRandom - это функция. Функции - это объекты первого класса, которые могут быть переданы в качестве аргументов другим функциям. В Python скобки после функции приводят к ее вызову.

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