Imagen en un botón

Espero la misma salida para los dos scripts a continuación.

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

Script 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() 

Script 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() 

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

Para evitar esto, guarde una referencia a la imagen. Por ejemplo, en lugar de photo usa self.photo

es trabajo

 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() 
 photo = PhotoImage(file = 'mine32.gif') small_logo = logo.subsample(5, 5) self.b.config(image = small_logo , compound = LEFT )