anonymous
anonymous

Reputation: 439

_tkinter.TclError: image "..." doesn't exist

I know that this question has already been asked several times, but I still couldn't figure out the answer to my problem. I keep getting the same error and don't know how to solve it.

This is my code:

from Tkinter import *
from PIL import Image, ImageTk
import os

window = Tk()
i = Image.open(pathToImage) 
if os.path.isfile(pathToImage):

     print 'image exists'
else:   
     print 'image does not exits'

label=Label(window, image=i)
label.pack()
window.mainloop()

It says that the image exists at the indicated path, but I keep getting this error message:

Traceback (most recent call last):
  File "ImageTest.py", line 31, in <module>
    label=Label(window, image=i)
  File "C:\Users\username\Anaconda2\lib\lib-tk\Tkinter.py", line 2597, in __init__
Widget.__init__(self, master, 'label', cnf, kw)
  File "C:\Users\username\Anaconda2\lib\lib-tk\Tkinter.py", line 2096, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: image "<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=640x480 at 0x36DF278>" doesn't exist

I could not figure out how to solve this problem. Any help would be appreciated!

Upvotes: 21

Views: 51060

Answers (3)

andsa
andsa

Reputation: 241

It seems to be an Anaconda - Spyder - Iphyton problem. Solution is here.

Reciting this answer for future readers:

I struggled with the same problem, but only while using spyder (no problems using pydev in eclipse). I found for myself two solutions, that worked for me.

Solution 1: Goto Tools => Preferences and chose IPython console on the left. In the IPython console menu chose the Graphics Tab and disable the checkbox "Active support" at the top (Support for graphics). Save and restart you Kernel before you run the code

Solution 2: Goto Run => Configure and chose "Execute in an external System terminal", Save and run the code

As mentiond above, both solutions worked for my issue.

Upvotes: 2

Pedro Carlos
Pedro Carlos

Reputation: 161

A quick hacky fix is to provide the .PhotoImage with the correct master:

i = ImageTk.PhotoImage(pathToImage, master=window)

Upvotes: 16

Lafexlos
Lafexlos

Reputation: 7735

You should use PhotoImage instance as image value. Also, you need to keep the reference of your image.

im = Image.open(pathToImage)
ph = ImageTk.PhotoImage(im)

label = Label(window, image=ph)
label.image=ph  #need to keep the reference of your image to avoid garbage collection

Upvotes: 29

Related Questions