Search code examples
imagepython-3.xtkinterphotoimage

Adding image into button


In the process of learning tkinter, I came up against a problem: I can't add an image into a button:

from tkinter import*
from tkinter import ttk

root=Tk()

button=ttk.Button(root)
button.grid()
photo=PhotoImage(file="giphy.gif")
button.config(image=photo, compound=RIGHT)

root.mainloop()

That code makes an error:

<ipython-input-30-6ad3ebb78b5b> in <module>()
      7 button.grid()
      8 photo=PhotoImage(file="giphy.gif")
----> 9 button.config(image=photo, compound=RIGHT)
     10 
     11 root.mainloop()

/usr/lib/python3.5/tkinter/__init__.py in configure(self, cnf, **kw)
   1331         the allowed keyword arguments call the method keys.
   1332         """
-> 1333         return self._configure('configure', cnf, kw)
   1334     config = configure
   1335     def cget(self, key):

/usr/lib/python3.5/tkinter/__init__.py in _configure(self, cmd, cnf, kw)
   1322         if isinstance(cnf, str):
   1323             return self._getconfigure1(_flatten((self._w, cmd, '-'+cnf)))
-> 1324         self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
   1325     # These used to be defined in Widget:
   1326     def configure(self, cnf=None, **kw):

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

Why is it so? And how can I fix it?


Solution

  • As furas said in the comment, your code is perfectly runnable with python script.py.

    The error comes from the fact you are running it inside Jupyter QtConsole. To be able to run it in the Jupyter QtConsole, you need to explicitly tell tkinter what is the parent window of the PhotoImage. I think this is because in the console, the default parent is not the Tk instance you created but some hidden window. Because of that, the parent of your image is not the parent of the button, so tkinter does not find the image.

    The following code should run in the console:

    import tkinter as tk
    from tkinter import ttk
    
    root = tk.Tk()
    
    button = ttk.Button(root)
    button.grid()
    photo = tk.PhotoImage(file="giphy.gif", master=root)
    button.config(image=photo, compound=tk.RIGHT)