Shaori
Shaori

Reputation: 23

tkinter can not display the image

I want to put an image(light.gif) in the button of tkinter. However, the image is not shown and only a small transparent box appears at the specified position.

My Code is

from tkinter import* #To use Tkinter
from tkinter import ttk #To use Tkinter
from tkinter import messagebox #To use Tkinter
import tkinter.font # To use Font

win = Tk()
win.title("Main Control")
win.geometry('450x400+100+300')
win.resizable(0,0)

def a1():
     a1 = Toplevel()
     a1.title("a1")
     a1.geometry('450x350+560+100')
     a1.resizable(0,0)

     lignt_sensor_image=PhotoImage(file = 'light.gif')
     light_sensor_button=Button(a1,width=15,height=8)
     light_sensor_button.place=(x=275,y=200)
     a1.mainloop()

newa1 = Button(win, text='A1', font=font1, command=a1, height = 5, width = 10)
newa1.place(x=50, y=30)
win.mainloop()

Please help me

Upvotes: 1

Views: 51

Answers (1)

Reblochon Masque
Reblochon Masque

Reputation: 36742

You must keep a reference to the image; as it is created in a function, it was destroyed the moment the function exited.
There also were typos in your code that prevented it from running.

The following shows your image in the popup window.

import tkinter as tk
from tkinter import PhotoImage


def spawn_toplever_a1(): 
    global light_sensor_image                  # <- hold the image in the global variable, so it persists
    a1 = tk.Toplevel()                         # do not name your variables the same as your function
    a1.title("a1")
    a1.geometry('450x350+560+100')
    light_sensor_image = PhotoImage(file='light.gif')
    light_sensor_button = tk.Button(a1, image=light_sensor_image, text="my image", compound="center")

    light_sensor_button.place(x=275,y=100)   # <-- typo - removed '=' sign
                                             # <-- removed call to mainloop

light_sensor_image = None                    # declare variable to hold the image

win = tk.Tk()
win.title("Main Control")
win.geometry('450x400+100+300')
win.resizable(0,0)    

newa1 = tk.Button(win, text='A1', command=spawn_toplever_a1, height = 5, width = 10)
newa1.place(x=50, y=30)
win.mainloop()

Upvotes: 2

Related Questions