¿Por qué no se muestra la imagen Tkinter si se crea en una función?

Este código funciona:

import tkinter root = tkinter.Tk() canvas = tkinter.Canvas(root) canvas.grid(row = 0, column = 0) photo = tkinter.PhotoImage(file = './test.gif') canvas.create_image(0, 0, image=photo) root.mainloop() 

Me muestra la imagen.

Ahora, este código se comstack pero no me muestra la imagen, y no sé por qué, porque es el mismo código, en una clase:

 import tkinter class Test: def __init__(self, master): canvas = tkinter.Canvas(master) canvas.grid(row = 0, column = 0) photo = tkinter.PhotoImage(file = './test.gif') canvas.create_image(0, 0, image=photo) root = tkinter.Tk() test = Test(root) root.mainloop() 

La photo variable es una variable local que se recolecta en la basura después de que se crea una instancia de la clase. Guarda una referencia a la foto, por ejemplo:

 self.photo = tkinter.PhotoImage(...) 

Si realiza una búsqueda en Google sobre “la imagen tkinter no se muestra”, el primer resultado es este:

http://effbot.org/pyfaq/why-do-my-tkinter-images-not-appear.htm

Solo agrega global photo como la primera línea dentro de la función.