Python Tkinter rotate image animation
Here is an example which rotates an image using Python3:
import tkinter as tkfrom PIL import ImageTkfrom PIL import Imageclass 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 %= 360root = tk.Tk()app = SimpleApp(root, '/path/to/image.png')root.mainloop()
For a Python2 version, see the revision history.
Here's unutbu's answer above, but in Python 3:
import timeimport tkinterfrom PIL import Image, ImageTkclass 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()
It took me a while to get this working, so I figured I would share.