web-dev-qa-db-ja.com

ボタンの画像

以下の両方のスクリプトで同じ出力が期待されます。

しかし、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()
21
coder

画像オブジェクトへの唯一の参照はローカル変数です。 __init__が終了すると、ローカル変数はガベージコレクションされ、イメージは破棄されません。 2番目の例では、イメージがグローバルレベルで作成されているため、スコープ外になることはなく、したがってガベージコレクションされることもありません。

これを回避するには、画像への参照を保存します。たとえば、photoの代わりにself.photoを使用します

28
Bryan Oakley
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()
1
user8777433

tkinterインポートから*

root= Tk()

btnPlay = Button(root)
btnPlay.config(image=imgPlay, width="30", height="30")
btnPlay.grid(row=0, column=0)

root.mainloop()
0
Mawty