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