How to open PIL Image in Tkinter on Canvas How to open PIL Image in Tkinter on Canvas tkinter tkinter

How to open PIL Image in Tkinter on Canvas


Try creating a PIL Image first, then using that to create the PhotoImage.

from Tkinter import *import Image, ImageTkroot = Tk()root.geometry('1000x1000')canvas = Canvas(root,width=999,height=999)canvas.pack()pilImage = Image.open("ball.gif")image = ImageTk.PhotoImage(pilImage)imagesprite = canvas.create_image(400,400,image=image)root.mainloop()


(An old question, but the answers so far are only half-complete.)

Read the docs:

class PIL.ImageTk.PhotoImage(image=None, size=None, **kw)
  • image – Either a PIL image, or a mode string. [...]
  • file – A filename to load the image from (using Image.open(file)).

So in your example, use

image = ImageTk.PhotoImage(file="ball.gif")

or explicitly

image = ImageTk.PhotoImage(Image("ball.gif"))

(And remember – as you did correctly: Keep a reference to the image object in your Python program, otherwise it is garbage-collected before you seee it.)


You can import multiple image formats, and resize with this code. "basewidth" sets the width of your image.

from Tkinter import *import PILfrom PIL import ImageTk, Imageroot=Tk()image = Image.open("/path/to/your/image.jpg")canvas=Canvas(root, height=200, width=200)basewidth = 150wpercent = (basewidth / float(image.size[0]))hsize = int((float(image.size[1]) * float(wpercent)))image = image.resize((basewidth, hsize), PIL.Image.ANTIALIAS)photo = ImageTk.PhotoImage(image)item4 = canvas.create_image(100, 80, image=photo)canvas.pack(side = TOP, expand=True, fill=BOTH)root.mainloop()