Я медленно осваиваю Python и tkinter. :)
В игре, которую я создаю, есть анимация изображений, отображаемых внутри виджетов (а именно кнопок).
Покадровая анимация - это обычное дело, поэтому я придумал функцию, которая поможет мне автоматизировать 10-кадровую анимацию.
В цикле range(10)
(так как у меня 10 кадров) функция вызывает метод after()
, который имеет обратный вызов функции, каждый из которых отображает следующий кадр анимации.
Поскольку время в методе after увеличивается для каждой последующей итерации цикла, каждый новый кадр должен отображаться красиво по истечении заданного времени (здесь это 34 мс).
Теоретически это нормально, однако, когда я запускаю код и вызываю соответствующие функции, кнопка не анимируется должным образом. Кажется, выскакивает только последний кадр.
Я вижу это после некоторого чтения о том, как работает tkinter, так это то, что каждый after в цикле должен устанавливать независимый обратный вызов на «временной шкале» tkinter, который будет вызываться через некоторое время. Таким образом, на мой взгляд, этот код должен работать.
Что ты об этом думаешь? Что я не так, моя логика насчет after()
в замкнутом цикле?
#Python 3.4.3
def animateMine(object):
global firstAnimateMineCall
for frame in range(10):
frame += 1
time = 34 * frame
root.after(time, lambda: mineAnimationFrame(object, frame))
if firstAnimateMineCall and frame == 10:
root. after(500 , lambda: animateAllMines(object))
firstAnimateMineCall = False
В сомнительном случае это пригодится:
def mineAnimationFrame(object, frame):
tempDir = "Resources/Mine/saperx_mine_%s.png" % (frame)
tempImage = PhotoImage(file=tempDir)
object.configure(image=tempImage)
object.image = tempImage
object.disabled = True
object.image = tempImage
, чтобы изображение не было мусором. Кроме того, если вы прочитали это, вы заметили, что я явно указал, что последний кадр виден, чего не было бы, если бы проблема была с возвратом мусора изображения func ... :) - person CyberGeneticist   schedule 03.08.2015