Tkinter画布动态删除/动画对象

时间:2019-02-10 20:53:26

标签: python tkinter

有几种解决方法,但是有没有办法以类似的方式运行此代码?

import time
import tkinter as tk
root = tk.Tk()

...canvas stuff...

class thing():
    def __init__(self, canvas):
        self.id = canvas.create_oval(...)
    def something(self):
        canvas.delete(self.id)
        self.id = canvas.create_oval(...)
        canvas.move(self.id, 10, 0)

t = thing()
while True:
    t.something()
    root.update_idletasks()
    root.update()
    time.sleep(0.01)

上面的脚本应该使一个圆成为动画,但不是。 (顺便说一句)我不是在寻找一种方法来修复此代码。

是否可以动态创建对象名称(动态替换self.id)?

1 个答案:

答案 0 :(得分:0)

您应该编写执行动画一帧的功能。然后,使用after按计划运行该命令。

这是一个非常基本的示例:

import tkinter as tk

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

class thing():
    def __init__(self, canvas):
        self.canvas = canvas
        self.id = canvas.create_oval(10, 10, 20, 20, outline="red", fill="red")

    def animate(self):
        self.canvas.move(self.id, 10, 10)
        self.canvas.after(100, self.animate)

t = thing(canvas)
t.animate()
root.mainloop()

当然,您需要添加其他代码才能停止动画,或者在对象遇到边缘或离开屏幕时对其进行更改,等等。但这说明了一般原理。在animate中,您可以添加所需的任何其他逻辑。