Python Tkinter 2.7 Edición con imagen.

Estoy tratando de mostrar una imagen en una ventana … parece lo suficientemente simple, ¿verdad? Bueno, tengo un gran error!

Tengo este mismo código EXACTO en un archivo:

import Tkinter root = Tkinter.Tk() canvas = Tkinter.Canvas(root) canvas.grid(row = 0, column = 0) photo = Tkinter.PhotoImage(file = '/Users/Richy/Desktop/1.gif') image1 = canvas.create_image(0,0, image=photo) root.mainloop() 

Funciona.

Tengo esto en parte de un archivo más grande:

 def officialPictureWindow(self): t = Toplevel(self) t.wm_title("Official Image") self.__canvas3 = Canvas(t) self.__canvas3.grid(row = 0, column = 0) photo = PhotoImage(file = '/Users/Richy/Desktop/1.gif') image1 = self.__canvas3.create_image(0,0, image=photo) 

¡No funciona!

Esa función se activa cuando alguien presiona un botón en una barra de menú que tengo. Todos los otros botones de la barra de menú que tengo funcionan correctamente y muestran sus ventanas. Aunque no hay imágenes en los otros.

Esto no da ningún error. Sólo una pantalla en blanco … ¿Alguien sabe por qué?

Debe mantener una referencia adicional a la photo para que no se recoja basura de forma prematura al final de la función. Una introducción a Tkinter explica más:

Nota: Cuando Python recolecta un objeto PhotoImage (por ejemplo, cuando regresa de una función que almacenó una imagen en una variable local), la imagen se borra incluso si se muestra con un widget Tkinter.

Para evitar esto, el progtwig debe mantener una referencia adicional al objeto de imagen. Una forma sencilla de hacer esto es asignar la imagen a un atributo de widget, como este:

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

En su caso, podría adjuntar la imagen a su self variable, o tal vez el canvas. Realmente no importa, siempre y cuando esté asignado a algo.

 self.image = photo #or: self.__canvas3.image = photo