Tkinter 如何在不重新绘制每个元素的情况下更新画布?

Tkinter 如何在不重新绘制每个元素的情况下更新画布?,tkinter,Tkinter,假设我有一张画布,它有一些用tkinter形状绘制的背景,在上面我画了一个圆圈 是否可以只重绘圆圈,而不是每次都重绘背景 示例代码: import Tkinter class gui(Tkinter.Tk): def draw_background(self): self.canvas.create_oval(0,0, 500, 500, fill = 'black') def draw_circle(self,x, y): self.

假设我有一张画布,它有一些用tkinter形状绘制的背景,在上面我画了一个圆圈

是否可以只重绘圆圈,而不是每次都重绘背景

示例代码:

import  Tkinter

class gui(Tkinter.Tk):  

    def draw_background(self):
        self.canvas.create_oval(0,0, 500, 500, fill = 'black')

    def draw_circle(self,x, y):
        self.canvas.create_oval(x,y, x+10,y+10, fill = 'green')



    def __init__(self, parent):
        Tkinter.Tk.__init__(self, parent)
        self.guiHeight = 800
        self.guiWidth = 800
        self.initialise()

    def animation(self):

        self.x = self.x +1%100
        self.y = self.y +1%100

        self.canvas.delete("all")
        self.draw_background()      
        self.draw_circle(self.x, self.y)

        self.after(100,self.animation)

    def initialise(self):
        self.title('traffic')

        self.canvas = Tkinter.Canvas(self, height = self.guiHeight, width = self.guiWidth)
        self.draw_background()      
        self.canvas.pack()

        self.x = 0
        self.y = 0
        self.after(100, self.animation)
        self.mainloop()


if __name__ == "__main__":
    app = gui(None) 
这段代码将完全实现我想要它做的事情。一个绿点向右下角移动,并显示在背景圆的顶部


但是,如果每次都告诉它重新绘制背景图像(想象一下,如果绘制背景时涉及大量计算),那么它是否可以显示在其顶部的透明层上,而只需重新绘制该层?

您可以使用该方法移动画布上的任何项目。您还可以选择任意一项并重新绘制它。这些都不需要重新绘制任何其他对象

创建项时,将返回一个ID,您可以将该ID提供给move或delete方法

self.circle_id = self.canvas.create_oval(x,y, x+10,y+10, fill = 'green')
...
# move the circle 10 pixels in the x and y directions
self.canvas.move(self.circle_id, 10,10)
您还可以为一个或多个元素提供一个标记(实际上是一个标记列表),然后在单个命令中移动或删除带有该标记的所有元素:

self.canvas.create_oval(x, y, x+10, y+10, fill='green', tags=("circle",))
...
self.canvas.move("circle", 10, 10)
您还可以计算圆的所有新坐标,然后使用以下方法进行更新:


您可以使用该方法移动画布上的任何项目。您还可以选择任意一项并重新绘制它。这些都不需要重新绘制任何其他对象

创建项时,将返回一个ID,您可以将该ID提供给move或delete方法

self.circle_id = self.canvas.create_oval(x,y, x+10,y+10, fill = 'green')
...
# move the circle 10 pixels in the x and y directions
self.canvas.move(self.circle_id, 10,10)
您还可以为一个或多个元素提供一个标记(实际上是一个标记列表),然后在单个命令中移动或删除带有该标记的所有元素:

self.canvas.create_oval(x, y, x+10, y+10, fill='green', tags=("circle",))
...
self.canvas.move("circle", 10, 10)
您还可以计算圆的所有新坐标,然后使用以下方法进行更新:


您可以使用该方法移动画布上的任何项目。您还可以选择任意一项并重新绘制它。这些都不需要重新绘制任何其他对象

创建项时,将返回一个ID,您可以将该ID提供给move或delete方法

self.circle_id = self.canvas.create_oval(x,y, x+10,y+10, fill = 'green')
...
# move the circle 10 pixels in the x and y directions
self.canvas.move(self.circle_id, 10,10)
您还可以为一个或多个元素提供一个标记(实际上是一个标记列表),然后在单个命令中移动或删除带有该标记的所有元素:

self.canvas.create_oval(x, y, x+10, y+10, fill='green', tags=("circle",))
...
self.canvas.move("circle", 10, 10)
您还可以计算圆的所有新坐标,然后使用以下方法进行更新:


您可以使用该方法移动画布上的任何项目。您还可以选择任意一项并重新绘制它。这些都不需要重新绘制任何其他对象

创建项时,将返回一个ID,您可以将该ID提供给move或delete方法

self.circle_id = self.canvas.create_oval(x,y, x+10,y+10, fill = 'green')
...
# move the circle 10 pixels in the x and y directions
self.canvas.move(self.circle_id, 10,10)
您还可以为一个或多个元素提供一个标记(实际上是一个标记列表),然后在单个命令中移动或删除带有该标记的所有元素:

self.canvas.create_oval(x, y, x+10, y+10, fill='green', tags=("circle",))
...
self.canvas.move("circle", 10, 10)
您还可以计算圆的所有新坐标,然后使用以下方法进行更新: