2010-11-28 13 views
10

Espero la misma salida para ambos scripts a continuación.Imagen en un botón

Pero no obtengo la imagen en el botón cuando ejecuto Script 1. Sin embargo, Script 2 funciona bien.

Escritura 1

from Tkinter import * 
    class fe: 
    def __init__(self,master): 
     self.b=Button(master,justify = LEFT) 
     photo=PhotoImage(file="mine32.gif") 
     self.b.config(image=photo,width="10",height="10") 
     self.b.pack(side=LEFT) 
root = Tk() 
front_end=fe(root) 
root.mainloop() 

Guión 2

from Tkinter import * 
root=Tk() 
b=Button(root,justify = LEFT) 
photo=PhotoImage(file="mine32.gif") 
b.config(image=photo,width="10",height="10") 
b.pack(side=LEFT) 
root.mainloop() 

Respuesta

16

La única referencia al objeto de imagen es una variable local. Cuando sale __init__, la variable local es recogida de basura para que la imagen no se destruya. En el segundo ejemplo, debido a que la imagen se crea a nivel global, nunca sale del alcance y, por lo tanto, nunca se recolecta basura.

Para solucionar esto, guarde una referencia a la imagen. Por ejemplo, en lugar de utilizar photoself.photo

+0

Gran! ¡Gracias! – coder

+0

Supongo que querías decir "Cuando' __init__' sale ", no" existe ". – martineau

+0

@martineau: sí, gracias. He editado la respuesta. –

0

su labor

x1=Button(root) 
photo=PhotoImage(file="Re.png") 
x1.config(image=photo,width="40",height="40",activebackground="black" 
,bg="black", bd=0,command=sil) 
x1.place(relx=1,x=5, y=-5, anchor=NE) 

pero esto es inútil

def r(): 
    x1=Button(root) 
    photo=PhotoImage(file="Re.png") 
    x1.config(image=photo,width="40",height="40",activebackground="black", 
    bg="black", bd=0,command=sil) 
    x1.place(relx=1,x=5, y=-5, anchor=NE) 

r() 
Cuestiones relacionadas