以下の両方のスクリプトで同じ出力が期待されます。
しかし、Script 1を実行しても、ボタンに画像が表示されません。ただし、Script 2はうまく機能します。
スクリプト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()
スクリプト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()
画像オブジェクトへの唯一の参照はローカル変数です。 __init__
が終了すると、ローカル変数はガベージコレクションされ、イメージは破棄されません。 2番目の例では、イメージがグローバルレベルで作成されているため、スコープ外になることはなく、したがってガベージコレクションされることもありません。
これを回避するには、画像への参照を保存します。たとえば、photo
の代わりにself.photo
を使用します
logo = PhotoImage(file = 'mine32.gif')
small_logo = logo.subsample(5, 5)
self.b.config(image = small_logo , compound = LEFT )
その仕事
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)
これは役に立たない
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()
tkinterインポートから*
root= Tk()
btnPlay = Button(root)
btnPlay.config(image=imgPlay, width="30", height="30")
btnPlay.grid(row=0, column=0)
root.mainloop()