How to open PIL Image in Tkinter on Canvas

限于喜欢 提交于 2019-12-04 03:36:39

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

from Tkinter import *
import Image, ImageTk
root = 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 PIL
from PIL import ImageTk, Image

root=Tk()
image = Image.open("/path/to/your/image.jpg")
canvas=Canvas(root, height=200, width=200)
basewidth = 150
wpercent = (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()

I was banging my head against the wall for a while on this issue until I found the following:

http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm

Apparently, Python's garbage collector can trash the ImageTk object. I imagine apps using alot of widgets (like mine) are more susceptible to this behavior.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!