Tkinker and online resizing of .jpg with Pillow (PIL)

Question:

Trying to include a slider to resize images online in a Tkinker-GUI-Application of python.

Problem: Canvas Resizing works, Inital Show of original sized image, too. But when using the slider the picture is not resized – it just shows very short in the adjusted size and is then somehow "overwritten" by the original one.

from tkinter import *
from turtle import width
from PIL import Image, ImageTk
import FileDownloader

window = Tk()
window.title ('Price Catcher')

#PIL to open a jpg and store a Tk compatible objekct
headerpic = Image.open("./10374_0.jpg")

def resizePictures(scalerValue):
    print(scalerValue)
    print(window.canvas.find_all())
    headerpicTk = ImageTk.PhotoImage(headerpic.resize((int(scalerValue), int(scalerValue)), Image.ANTIALIAS))
    window.canvas.config(width=int(scalerValue), height=int(scalerValue))
    #window.canvas.delete("all")
    canvas_id = window.canvas.create_image(0,0, anchor=NW, image=headerpicTk)
    window.canvas.update()
    
#Picture Resizer
PicResizeScale = IntVar() #Control Variable to use for Picture Resizing Value of Scaler
window.scale = Scale(window, label='Bildgröße in %', orient=HORIZONTAL, resolution=10, length=300, from_=0, to=200, command=resizePictures)
window.scale.set(100)
window.scale.pack(side=TOP)

#PIL to open a jpg and store a Tk compatible objekct
headerpic = Image.open("./10374_0.jpg")
headerpicTk = ImageTk.PhotoImage(headerpic)

#Place the opject to the canvas
window.canvas = Canvas(window, width=100, height=100)
window.canvas.pack()
canvas_id = window.canvas.create_image(0,0, anchor=NW, image=headerpicTk)

window.downloadbutton = Button(window, text='Download Bild', command=FileDownloader.FileDownloader("https://www.silbertresor.de/images/product_images/info_images/10374_0.jpg", ".\10374_0.jpg"), justify= LEFT)
window.downloadbutton.pack(side = BOTTOM)
window.exitbutton = Button(window, text='Schließen', command=exit, justify= RIGHT)
window.exitbutton.pack(side= BOTTOM)

window.mainloop()

Any hints – i’m lost :(..

Asked By: Matthias

||

Answers:

PhotoImage has bug which removes image when it is assigned to local variable in function.

And inside resizePictures you assign new PhotoImage to local variable headerpicTk.

You have to add global headerpicTk to assign PhotoImage to global variable headerpicTk.

def resizePictures(scalerValue):
    global headerpicTk

    print(scalerValue)

    # ...rest ...

That’s all.

Answered By: furas