Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tkinter Label does not show Image

Tags:

python

tkinter

I'm trying to learn some tkinter. I can't get tkinter to display an icon. I don't know where it goes wrong. It does not produce any error and it respects the size of the image, but it's invisible. Everything I found online tells to add a second reference to prevent garbage collection from python, but somehow this did not the trick. Here is the part of my code that goes wrong:

from Tkinter import *
from PIL import Image, ImageTk

class GUI:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        #status bar
        self.bar = Frame(root, relief=RIDGE, borderwidth=5)
        self.bar.pack(side=TOP)

        self.iconPath = 'data/icons/size.png'
        self.icon = ImageTk.PhotoImage(Image.open(self.iconPath))
        self.icon_size = Label(self.bar, image = self.icon)
        self.icon_size.pack(side=LEFT)

root = Tk()


app = GUI(root)

root.mainloop()
like image 200
Whitecold Avatar asked Oct 30 '12 23:10

Whitecold


People also ask

Can you use images in Tkinter?

Tkinter's label widget can be used to display either images or text. To display an image requires the use of Image and ImageTk imported from the Python Pillow (aka PIL) package.

What is PIL in Tkinter?

The PIL or Pillow package in Python provides a way to process images in a program. We can open an image, manipulate the image for different use, and can use it to visualize the data as well. In order to use the PIL package in Tkinter, you've to install the Python Pillow library in your environment.

How do I show an image on a button click in Python?

Practical Data Science using Python So, the following steps make the desired image a button, First, we will create a dummy button which can be used to make the image clickable. Grab the image from the source using PhotoImage(file) function. Pass the image file as the value in Button function.


2 Answers

When you add a PhotoImage or other Image object to a Tkinter widget, you must keep your own reference to the image object. If you don’t, the image won’t always show up.

Decision here

like image 196
user1142464 Avatar answered Oct 17 '22 21:10

user1142464


For some reason (I don't understand exactly why) you must anchor the image object into the widget in order for it to display. Therefore try the following change at your code:

from Tkinter import *
from PIL import Image, ImageTk

class GUI:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        #status bar
        self.bar = Frame(root, relief=RIDGE, borderwidth=5)
        self.bar.pack(side=TOP)

        self.iconPath = 'data/icons/size.png'
        self.icon = ImageTk.PhotoImage(Image.open(self.iconPath))
        self.icon_size = Label(self.bar)
        self.icon_size.image = self.icon  # <== this is were we anchor the img object
        self.icon_size.configure(image=self.icon)
        self.icon_size.pack(side=LEFT)

root = Tk()


app = GUI(root)

root.mainloop()

Good Luck!

like image 34
Diego Vélez Avatar answered Oct 17 '22 22:10

Diego Vélez