alin_hunter07 alin_hunter07 - 4 months ago 27
Python Question

Cannot construct tkinter.PhotoImage from PIL Image

I try to show a image in a label when I push a button, but the image are too large and I have tried to resize the image. I have created this function:

def image_resize(imageFile):
width = 500
height = 300
image = Image.open(imageFile)
im2 = image.resize((width, height), Image.ANTIALIAS)
return im2


To show the image I have created this function:

def show_image():
label_originalimage ['image'] = image_tk


And the button with the
command=show_image
:

filename = 'bild_1.jpg'
image_resize = image_resize(filename)
image_tk = PhotoImage(image_resize)
button_open = Button(frame_open, text='Open Image', command=show_image)


I get only this:

TypeError : __str__ returned non-string (type instance)

Answer

The PhotoImage class from tkinter takes a filename as an argument, and as it cannot convert the image into a string, it complains. Instead, use the PhotoImage class from the PIL.ImageTk module. This works for me:

from tkinter import *
from PIL import ImageTk, Image

def image_resize(imageFile):
    width = 500
    height = 300
    image = Image.open(imageFile)
    im2 = image.resize((width,height), Image.ANTIALIAS)
    return im2

def show_image():
    label_originalimage ['image'] = image_tk

root = Tk()
filename = './Pictures/Space/AP923487321702.jpg'
image_resize = image_resize(filename)
image_tk = ImageTk.PhotoImage(image_resize)

label_originalimage = Label(root)
label_originalimage.pack()

button_open = Button(root, text='Open Image', command=show_image)
button_open.pack()

root.mainloop()

Notice the change from image_tk = PhotoImage(image_resize) to image_tk = ImageTk.PhotoImage(image_resize).