努力在Tkin中设置图像动画

2024-09-30 04:41:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经开始编写一个连接4游戏(一个点击触发一个光盘下降),我想动画光盘的下跌。 因此,我首先创建一个新的光盘映像:

discList[y][x] = can.create_image((xCan,yCurrent), image=imgRedDisc, anchor="nw")

光盘在画布顶部xCan;yCurrent创建。我现在要做的是制作一张碟片掉到目的地yCan的动画。我调用drop函数,该函数不断增加磁盘的yCurrent,直到它通过递归和after()方法到达yCan:

^{pr2}$

现在我的问题是光盘的中间位置不显示,它只在几秒钟后直接显示在底部。 经过一番研究,我添加了一行来更新画布:

def drop(disc):
    global yCan, yCurrent
    can.move(disc, 0, 1)
    yCurrent += 1
    can.update()
    if yCurrent < yCan:
        can.after(5, drop(disc))

现在我看到我的碟片掉下来了,但是每次播放后它都会迟钝;我点击几秒钟后,碟片才开始掉落(这会触发它们的掉落)。另一个问题是,如果我通过快速双击触发两个光盘几乎是一样地掉落,第一个光盘在中途停止下落,然后直接从画布上掉下来。在

我的问题是,如果没有can.update(),我如何显示光盘坠落的每一步? 另外,我将每个光盘id存储在一个列表(discList)中,有没有更方便的方法来存储动态创建的画布图像?在


Tags: 方法函数image画布动画candropdisc
1条回答
网友
1楼 · 发布于 2024-09-30 04:41:32

在tkinter中制作动画的正确方法是让一个函数执行一帧动画,然后让它反复调用自己,直到出现某种终止条件。在

例如:

def move_object(obj_id):
    can.move(obj_id, 0, 1)
    x0,y0,x1,y1 = can.coords(obj_id)
    if y0 < yCan: 
        can.after(5, move_obj, obj_id)

与您所写内容的主要区别在于您错误地使用了after。你在做这个:

^{pr2}$

。。。与此完全相同:

result = drop(disc)
can.after(5, drop)

注意到区别了吗?与command属性类似,必须向函数提供引用。但是,您调用了函数,然后将结果赋给after。在

下面是一个非常简单的实验示例:

import tkinter as tk

root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack(fill="both", expand=True)

ball = canvas.create_oval(50,0,100,50, fill="red")

def animate(obj_id):
    canvas.move(obj_id, 0, 3)
    x0,y0,x1,y1 = canvas.coords(obj_id)
    if y0 > canvas.winfo_height():
        canvas.coords(obj_id, 50,-50, 100, 0)
    canvas.after(50, animate, obj_id)

animate(ball)
root.mainloop()

相关问题 更多 >

    热门问题