Tkinter.PhotoImage doesn’t not support png image

I am using Tkinter to write a GUI and want to display a png file in a Tkiner.Label.
So I have some code like this:

self.vcode.img = PhotoImage(data=open('test.png').read(), format='png')
self.vcode.config(image=self.vcode.img)

This code runs correctly on my Linux machine. But when I run it on my windows machine, it fails. I also tested on several other machines (include windows and linux), it failed all the time.

The Traceback is:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:Python27liblib-tkTkinter.py", line 1486, in __call__
    return self.func(*args)
  File "C:Documents and SettingsStclientGUI.py", line 150, in showrbox
    SignupBox(self, self.server)
  File "C:Documents and SettingsStclientGUI.py", line 197, in __init__
    self.refresh_vcode()
  File "C:Documents and SettingsStclientGUI.py", line 203, in refresh_vcode
    self.vcode.img = PhotoImage(data=open('test.png').read(), format='png')
  File "C:Python27liblib-tkTkinter.py", line 3323, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:Python27liblib-tkTkinter.py", line 3279, in __init__
   self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: image format "png" is not supported

If I delete format='png' in the source code, the traceback will become:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:Python27liblib-tkTkinter.py", line 1486, in __call__
    return self.func(*args)
  File "C:Documents and SettingsStclientGUI.py", line 150, in showrbox
    SignupBox(self, self.server)
  File "C:Documents and SettingsStclientGUI.py", line 197, in __init__
    self.refresh_vcode()
  File "C:Documents and SettingsStclientGUI.py", line 203, in refresh_vcode
    self.vcode.img = PhotoImage(data=open('test.png').read())
  File "C:Python27liblib-tkTkinter.py", line 3323, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "C:Python27liblib-tkTkinter.py", line 3279, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
TclError: couldn't recognize image data

So, what should I do to make it support png files?

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

PIL is now replaced by Pillow http://pillow.readthedocs.io/en/3.2.x/

solution:

from Tkinter import *
import PIL.Image
import PIL.ImageTk

root = Toplevel()

im = PIL.Image.open("photo.png")
photo = PIL.ImageTk.PhotoImage(im)

label = Label(root, image=photo)
label.image = photo  # keep a reference!
label.pack()

root.mainloop()

If PIL could not be found in code, you do need a pillow install:

pip install pillow

Method 2

tkinter only supports 3 file formats off the bat which are GIF, PGM, and PPM. You will either need to convert the files to .GIF then load them (Far easier, but as jonrsharpe said, nothing will work without converting the file first) or you can port your program to Python 2.7 and use the Python Imaging Library (PIL) and its tkinter extensions to use a PNG image.

A link that you might find useful: http://effbot.org/tkinterbook/photoimage.htm

Method 3

Tkinter 8.6 supports png file format while tkinter 8.5 does not. If you have the option upgrade python and you should be fine to use png.
If you have to use an older version of python you should use Pillow (maintained pil fork) which also works on python3.

If you are starting a new project do not use python2 or PIL as suggested in the accepted answer, they are both depreciated technologies.

Method 4

Fixed in official python.org 64-bit (only) installer for OS X. Tk version 8.6 is included out of the box. Warning: if you use homebrew, as of this post doing brew install python3 will only give you 8.5, and 8.6 is required to use png so you’ll have to use official installer instead. To check which Tk you are using:

$ python3 -c 'import tkinter; print(tkinter.TkVersion);'

If it report 8.6, you are good to go.

Method 5

from tkinter import *
from tkinter import messagebox
import os
from PIL import Image, ImageTk


root = Tk()
root.geometry("1300x720")
root.title("KEDİLERİMİZ ve KÖPEKLERİMİZ")
class Ana:
    def __init__(self,name,roll):
        self.name = name
        self.roll = roll
resim = Label(root,width=77,height=43,bg="blue")
resim.place(x=730,y=10)
o = "1.PNG"
hu = o.find(".")
mu = o[hu:]
if mu == ".gif" or mu == ".png":
    img = PhotoImage(file = o)
else:
    photo = Image.open(o)
    img = ImageTk.PhotoImage(photo)
resim.configure(image=img,width=img.width(),height=img.height())
resim.image = img

Method 6

on windows you gotta use this specific format:

Example = PhotoImage(file='photo.png')

and if you wish to resize it to a smaller size:

Example = Example.subsample(2, 2)

or

Example = Example.subsample(3, 3)

Total Code:

Example = PhotoImage(file='photo.png')
Example = Example.subsample(1, 1)

but future warning, you gotta file the file location in with the photo unless you put the photo in the same file as the script!

Method 7

try with PIL library instead of converting your image to GIF, PGM, or PPM (PhotoImage) only accept these 3 formats.

import tkinter as tk
import PIL.Image
import PIL.ImageTk

base = tk.Tk()
base.title("Dialy Dose")

logoPath = r"C:UserssaigopiDownloadslogo.png"

ref = PIL.Image.open(logoPath)
photo = PIL.ImageTk.PhotoImage(im)

inputEdit = tk.Label(base,text="Enter Quote")
save = tk.Button(base,text="Save",background="green",command=save())
logo = tk.Label(base,image=photo,text="Logo bro lite")
quote = tk.Label(base,text="I am saying you are more than something")

inputEdit.pack()
save.pack()
logo.pack()
quote.pack()

base.mainloop()

Method 8

I used PhotoImage to add my Gui an icon with png format.
Like in below, It can work or give you an idea.

iconn = PhotoImage(file = "arcen.png" )
root.iconphoto(0, iconn)


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x