Python Forum

Full Version: Create image on a Toplevel using tkinter
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I'm using tkinter to create a login system. The main window goes as:

my_window=tkinter.Tk()
my_window.title('Welcome To Login System 1.0 !')
my_window.geometry('639x591')

my_canvas=tkinter.Canvas(my_window, height=639, width=591)
welcome_image=ImageTk.PhotoImage(Image.open('welcome2.png'))
image=my_canvas.create_image(0,0, anchor='nw',image=welcome_image)
my_canvas.pack(side='top')
and it works pretty fine.
But when I try to load an image on a Toplevel, the sub-window just keeps blank no matter how I change the pic:

signup_window=tkinter.Toplevel(my_window)
signup_window.geometry('500x400')
signup_window.title('Sign up now')

signup_canvas = tkinter.Canvas(signup_window, height=500, width=400)
signup_image = ImageTk.PhotoImage(Image.open('signup_bg.png'))
image2 = signup_canvas.create_image(0, 0, anchor='nw', image=signup_image)
signup_canvas.pack(side='top')
Don't know what goes wrong. I use the PIL module to load the image.
Instead of using PIL I used tkinter.PhotoImage(file='imagefile') . When I ran your code I got two windows with two images. Maybe your signup_bg.png image file is bad.
(Jun-03-2020, 12:00 PM)deanhystad Wrote: [ -> ]Instead of using PIL I used tkinter.PhotoImage(file='imagefile') . When I ran your code I got two windows with two images. Maybe your signup_bg.png image file is bad.
I fixed it by adding one line:
global signup_image
Guess it's because of the garbage collection force or something.
I don't think garbage collection is the problem here. You get the garbage collection problem when you create an image in a function or method and use a local variable to reference the image. When the function exits all the local variables are deleted, there is nothing referencing the image, and it becomes available for garbage collection. Your code is not doing that. Your variables are not getting deleted, you image variable continues to reference your image, and your image should not get garbage collected.