pythontkinterresizepython-imaging-libraryresize-image

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)

Solution

  • 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).