2010-11-28 14 views
10

J'attends la même sortie pour les deux scripts ci-dessous.Image sur un bouton

Mais je ne reçois pas l'image sur le bouton lorsque j'exécute Script 1. Cependant, Script 2 fonctionne 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() 

Répondre

16

La seule référence à l'objet d'image est une variable locale. Lorsque __init__ se termine, la variable locale est collectée pour que l'image no soit détruite. Dans le deuxième exemple, parce que l'image est créée au niveau global, elle ne sort jamais de la portée et n'est donc jamais collectée. Pour contourner ce problème, enregistrez une référence à l'image. Par exemple, au lieu de photo utiliser self.photo

+0

Great! Merci! – coder

+0

Je suppose que vous vouliez dire "Quand" __init__' se termine ", pas" existe ". – martineau

+0

@martineau: oui, merci. J'ai édité la réponse. –

0

ses travaux

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) 

mais cela ne sert à rien

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