python - Tkinter.PhotoImage no es compatible con la imagen png
linux (5)
Estoy usando Tkinter para escribir una GUI y quiero mostrar un archivo png en un
Tkiner.Label
.
Entonces tengo un código como este:
self.vcode.img = PhotoImage(data=open(''test.png'').read(), format=''png'')
self.vcode.config(image=self.vcode.img)
Este código se ejecuta correctamente en mi máquina Linux . Pero cuando lo ejecuto en mi máquina Windows, falla. También probé en varias otras máquinas (incluidas Windows y Linux), fallaba todo el tiempo.
El rastreo es:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:/Python27/lib/lib-tk/Tkinter.py", line 1486, in __call__
return self.func(*args)
File "C:/Documents and Settings/St/client/GUI.py", line 150, in showrbox
SignupBox(self, self.server)
File "C:/Documents and Settings/St/client/GUI.py", line 197, in __init__
self.refresh_vcode()
File "C:/Documents and Settings/St/client/GUI.py", line 203, in refresh_vcode
self.vcode.img = PhotoImage(data=open(''test.png'').read(), format=''png'')
File "C:/Python27/lib/lib-tk/Tkinter.py", line 3323, in __init__
Image.__init__(self, ''photo'', name, cnf, master, **kw)
File "C:/Python27/lib/lib-tk/Tkinter.py", line 3279, in __init__
self.tk.call((''image'', ''create'', imgtype, name,) + options)
TclError: image format "png" is not supported
Si elimino
format=''png''
en el código fuente, el rastreo será:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:/Python27/lib/lib-tk/Tkinter.py", line 1486, in __call__
return self.func(*args)
File "C:/Documents and Settings/St/client/GUI.py", line 150, in showrbox
SignupBox(self, self.server)
File "C:/Documents and Settings/St/client/GUI.py", line 197, in __init__
self.refresh_vcode()
File "C:/Documents and Settings/St/client/GUI.py", line 203, in refresh_vcode
self.vcode.img = PhotoImage(data=open(''test.png'').read())
File "C:/Python27/lib/lib-tk/Tkinter.py", line 3323, in __init__
Image.__init__(self, ''photo'', name, cnf, master, **kw)
File "C:/Python27/lib/lib-tk/Tkinter.py", line 3279, in __init__
self.tk.call((''image'', ''create'', imgtype, name,) + options)
TclError: couldn''t recognize image data
Entonces, ¿qué debo hacer para que sea compatible con archivos png?
Corregido en el instalador oficial de python.org de 64 bits (solo) para OS X. La versión 8.6 de Tk se incluye de fábrica.
Advertencia: si usa homebrew, a partir de esta publicación, la
brew install python3
solo le dará 8.5, y 8.6 es necesario para usar png, por lo que deberá usar el instalador oficial.
Para verificar qué Tk está utilizando:
$ python3 -c ''import tkinter; print(tkinter.TkVersion);''
Si informa 8.6, estás listo para irte.
PIL ahora se reemplaza por Pillow http://pillow.readthedocs.io/en/3.2.x/
solución:
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()
Si no se puede encontrar
PIL
en el código, necesita instalar una
pillow
:
import tkinter as tk
import PIL.Image
import PIL.ImageTk
base = tk.Tk()
base.title("Dialy Dose")
logoPath = r"C:/Users/saigopi/Downloads/logo.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()
Tkinter 8.6 admite el formato de archivo png, mientras que tkinter 8.5 no. Si tienes la opción de actualizar Python y deberías usar png. Si tiene que usar una versión anterior de python, debe usar Pillow (horquilla pil mantenida) que también funciona en python3.
Si está comenzando un nuevo proyecto , no use python2 o PIL como se sugiere en la respuesta aceptada, ambas son tecnologías depreciadas.
intente con la biblioteca PIL en lugar de convertir su imagen a GIF, PGM o PPM (PhotoImage) solo acepta estos 3 formatos.
$ python3 -c ''import tkinter; print(tkinter.TkVersion);''
tkinter solo es compatible con 3 formatos de archivo que son GIF, PGM y PPM. Deberá convertir los archivos a .GIF y luego cargarlos (mucho más fácil, pero como dijo jonrsharpe, nada funcionará sin convertir el archivo primero) o puede portar su programa a Python 2.7 y usar la Biblioteca de imágenes de Python (PIL) y sus extensiones tkinter para usar una imagen PNG.
Un enlace que puede resultarle útil: here