Python Tkinter rotar imagen animación

Tengo una imagen de foto que creé usando PIL y luego la agregué a un canvas de TKinter. La imagen se muestra bien. Sin embargo, no puedo hacer que la función de rotación PIL funcione correctamente. Aquí está mi código:

#This works fine image = Image.open('img.png') canvas_image = ImageTk.PhotoImage(rotated_image) canvas_object = canvas.create_image(30+10*int(steps),250, image=canvas_image) canvas.pack() #this does not work canvas.delete(canvas_object) rotated_image = image.rotate(1) canvas_image = ImageTk.PhotoImage(rotated_image) canvas_object = canvas.create_image(30+10*int(steps),250, image=canvas_image) canvas.update() 

Sin embargo, la imagen simplemente no se muestra en este caso. Quiero poder animar la rotación de una imagen, ¡pero ni siquiera puedo hacer que una rotación funcione! Cualquier sugerencia es bienvenida.

Edición: corrección, la rotación no funcionará después de que ya se haya agregado a la pantalla

Aquí hay un ejemplo que rota una imagen usando Python3:

 import tkinter as tk from PIL import ImageTk from PIL import Image class SimpleApp(object): def __init__(self, master, filename, **kwargs): self.master = master self.filename = filename self.canvas = tk.Canvas(master, width=500, height=500) self.canvas.pack() self.update = self.draw().__next__ master.after(100, self.update) def draw(self): image = Image.open(self.filename) angle = 0 while True: tkimage = ImageTk.PhotoImage(image.rotate(angle)) canvas_obj = self.canvas.create_image( 250, 250, image=tkimage) self.master.after_idle(self.update) yield self.canvas.delete(canvas_obj) angle += 10 angle %= 360 root = tk.Tk() app = SimpleApp(root, '/path/to/image.png') root.mainloop() 

Para una versión de Python2, vea el historial de revisiones .

Aquí está la respuesta de unutbu arriba, pero en Python 3:

 import time import tkinter from PIL import Image, ImageTk class SimpleApp(object): def __init__(self, master, filename, **kwargs): self.master = master self.filename = filename self.canvas = tkinter.Canvas(master, width=500, height=500) self.canvas.pack() self.process_next_frame = self.draw().__next__ # Using "next(self.draw())" doesn't work master.after(1, self.process_next_frame) def draw(self): image = Image.open(self.filename) angle = 0 print(self.process_next_frame) while True: tkimage = ImageTk.PhotoImage(image.rotate(angle)) canvas_obj = self.canvas.create_image(250, 250, image=tkimage) self.master.after_idle(self.process_next_frame) yield self.canvas.delete(canvas_obj) angle += 1 angle %= 360 time.sleep(0.002) root = tkinter.Tk() app = SimpleApp(root, 'images.png') root.mainloop() 

Me tomó un tiempo lograr que esto funcionara, así que pensé que lo compartiría.