Otra situación donde tiene sentido almacenar el Id de una figura es cuando en un momento posterior queremos desplazarla a otra posición dentro del objeto Canvas.
Confeccionar un programa que que muestre un cuadrado dentro de un Canvas. Cuando se presione alguna de las teclas de flecha proceder a desplazar la figura 4 píxeles teniendo en cuenta la dirección de la tecla de flecha presionada.
La interfaz visual debe ser similar a esta:

import tkinter as tk
class Aplicacion:
def __init__(self):
self.ventana1=tk.Tk()
self.canvas1=tk.Canvas(self.ventana1, width=600, height=400, background="black")
self.canvas1.grid(column=0, row=0)
self.cuadrado=self.canvas1.create_rectangle(150,10,200,60, fill="red")
self.ventana1.bind("<KeyPress>", self.presion_tecla)
self.ventana1.mainloop()
def presion_tecla(self, evento):
if evento.keysym=='Right':
self.canvas1.move(self.cuadrado, 4, 0)
if evento.keysym=='Left':
self.canvas1.move(self.cuadrado, -4, 0)
if evento.keysym=='Down':
self.canvas1.move(self.cuadrado, 0, 4)
if evento.keysym=='Up':
self.canvas1.move(self.cuadrado, 0, -4)
aplicacion1=Aplicacion()
Creamos un objeto de la clase Canvas de 600 píxeles de ancho por 400 de alto:
self.canvas1=tk.Canvas(self.ventana1, width=600, height=400, background="black")
self.canvas1.grid(column=0, row=0)
Creamos un cuadrado de color rojo y guardamos su referencia en el atributo 'cuadrado':
self.cuadrado=self.canvas1.create_rectangle(150,10,200,60, fill="red")
Ponemos a escuchar el evento 'KeyPress' e indicamos el método a ejecutar en caso que se dispare:
self.ventana1.bind("<KeyPress>", self.presion_tecla)
En el método 'presion_tecla' verificamos cual de las cuatro teclas de flecha se ha presionado y llamamos al método 'move' de la clase Canvas, debemos pasar la referencia de la figura y cuantos píxeles se debe desplazar en 'x' e 'y':
def presion_tecla(self, evento):
if evento.keysym=='Right':
self.canvas1.move(self.cuadrado, 4, 0)
if evento.keysym=='Left':
self.canvas1.move(self.cuadrado, -4, 0)
if evento.keysym=='Down':
self.canvas1.move(self.cuadrado, 0, 4)
if evento.keysym=='Up':
self.canvas1.move(self.cuadrado, 0, -4)
x1, y1, x2, y2 = self.canvas1.coords(self.cuadrado)
ejercicio262.py
import tkinter as tk
class Aplicacion:
def __init__(self):
self.ventana1=tk.Tk()
self.canvas1=tk.Canvas(self.ventana1, width=600, height=400, background="black")
self.canvas1.grid(column=0, row=0)
self.cuadrado=self.canvas1.create_rectangle(150,10,200,60, fill="red")
self.ventana1.bind("<KeyPress>", self.presion_tecla)
self.ventana1.mainloop()
def presion_tecla(self, evento):
x1, y1, x2, y2 = self.canvas1.coords(self.cuadrado)
if evento.keysym=='Right':
if x2+4<=600:
self.canvas1.move(self.cuadrado, 4, 0)
if evento.keysym=='Left':
if x1-4>=0:
self.canvas1.move(self.cuadrado, -4, 0)
if evento.keysym=='Down':
if y2+4<=400:
self.canvas1.move(self.cuadrado, 0, 4)
if evento.keysym=='Up':
if y1-4>=0:
self.canvas1.move(self.cuadrado, 0, -4)
aplicacion1=Aplicacion()