python linux tkinter tk

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