我正在慢慢地通过Python和tkinter学习。 :)
在游戏中我制作了小部件(即按钮)中显示的图像动画。
逐帧动画是平凡的,所以我想出了一个功能来帮助我自动化10帧动画。
在range(10)
的循环中(因为我有10帧),该函数调用具有函数回调的after()
方法,每个方法都显示下一帧动画。
由于after方法中的时间对于循环的每个连续迭代都较大,因此每个新帧应该在给定时间之后很好地显示(这里是34ms)。
理论上这一切都很好,但是当我运行代码并调用适当的函数时,按钮没有正确的动画。只有最后一帧似乎弹出。
在看到tkinter如何工作之后,我看到它的方式是,每个循环之后应该在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
答案 0 :(得分:0)
我提出了一个简单,好看且易于实现的解决方案(感谢CurlyJoe的建议)。
*这个设计的一个主要专业是,它很容易调整到您的帧数...你有5?只需更改1个值就可以了!有900?还很容易。 6,02 * 10 ^ 23帧?仍然只有1个变化;] *
要调整帧大小,只需将列表推导range(10)
更改为您希望的数量,代码将处理其余的数据。
from tkinter import Tk, PhotoImage, Button, FLAT
root = Tk()
mineImagesList = [PhotoImage(file="Resources/Mine/saperx_mine_%s.png" % (frame)) for frame in range(1, 11)]
button = Button(root, bd=0, relief=FLAT, command= lambda: func(button))
def func (object, frame=0):
object.configure(image=mineImagesList[frame])
object.image = mineImagesList[frame]
print("Object image:", object.image)
if frame+1 < len(mineImagesList):
frame += 1
root.after(34, lambda frame=frame, object=object: func(object=object, frame=frame))
button.pack()
root.mainloop()