Python tkinter小部件图像动画功能,循环后行为不端

时间:2015-08-02 23:41:00

标签: python user-interface python-3.x animation tkinter

我正在慢慢地通过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

1 个答案:

答案 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()