Tkinter 如何在不重新绘制每个元素的情况下更新画布?
假设我有一张画布,它有一些用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.
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)
您还可以计算圆的所有新坐标,然后使用以下方法进行更新: