Python Tkinter rotate image animation Python Tkinter rotate image animation tkinter tkinter

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.