Python Tkinter 2.7 Emitir com imagem.

Eu estou tentando exibir uma imagem em uma janela …. parece simples o suficiente, certo? Bem, eu tenho um grande erro!

Eu tenho esse mesmo código EXATO em um arquivo:

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.

Eu tenho isso em parte de um arquivo maior:

 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) 

Não funciona!

Essa function é chamada quando alguém pressiona um botão em uma barra de menu que eu tenho. Todos os outros botões da barra de menu funcionam corretamente e mostram suas janelas. Não há imagens nos outros embora.

Isso não dá nenhum erro. Apenas uma canvas em branco .. alguém sabe por quê?

Você precisa manter uma referência adicional à photo para que ela não seja coletada prematuramente no final da function. Uma introdução ao Tkinter explica ainda mais:

Nota: Quando um object PhotoImage é coletado como lixo pelo Python (por exemplo, quando você retorna de uma function que armazena uma imagem em uma variável local), a imagem é limpa mesmo se estiver sendo exibida por um widget Tkinter.

Para evitar isso, o programa deve manter uma referência extra ao object de imagem. Uma maneira simples de fazer isso é atribuir a imagem a um atributo de widget, assim:

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

No seu caso, você poderia append a imagem à sua self variável, ou talvez à canvas. Realmente não importa, desde que seja atribuído a algo.

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