2016-04-08 5 views
0

画像は、ボタンひとつで働いたが、私は枠内のボタンの内側にイメージを実行するためにこのコードを使用しないときは、別のは、それだけで正常に動作します

image2= PhotoImage(file="questionmark.gif") 
f3buttonQ=Button(f3,image=image2, command = findcustomer).place(x=425,y=10) 

しかし、私はちょうどルートにこれを使用したいときフレームIは、このコードを使用:

image2= PhotoImage(file="questionmark.gif") 
f3buttonQ=Button(root, image=image2,command = findcustomer).place(x=450,y=110) 

イメージコードの後半部分をロードせず、両者の唯一の違いは最初のものでF3であろう。ありがとう。

更新:

だから私は、これを使用して作業にコマンドを得ることができた:

photo2= tk.PhotoImage(file="questionmark.gif") 
button = Button(image=photo2,command = findcustomer).place(x=450,y=110) 

私は一人でこれを実行すると、私はこれを追加するときに画像をボタンにちょうど完全にロードされているが、その下に空白がもう一度表示され、画像はロードされません。

f3findProduct=Button(image=photo2, command = findproduct).place(x=110,y=190) 
+2

私は、何が起こっているかを見るために完全なテストケースを提供することをお勧めします –

+0

私の推測では、image2への参照は保持されません。 [公式に行うcumentation](https://docs.python.org/2/library/tkinter.html#images):_イメージオブジェクトへの最後のPythonリファレンスが削除されると、イメージデータも削除されます._ –

+0

私はイメージを新しい名前(写真3など)で再表示してから、2番目のボタンコマンドを実行しますが、両方とも空に読み込まれるように見えました。画像の複製が必要ですが、別の名前で保存して各ボタンの画像を個別に呼び出すことはできますか? – Coder101

答えて

1

ここでは、画像がガベージコレクションされ、表示されなくなりました。あなたはそれの参照を保持する必要があります。 effbotから

:あなたはTkinterのウィジェットに光画像や他の画像オブジェクトを追加すると

、あなたは画像オブジェクトへの独自の参照を保持しなければなりません。そうしないと、 イメージが常に表示されるわけではありません。

Tkinter/TkインターフェイスがImageオブジェクトへの参照 を適切に処理しないという問題があります。 Tkウィジェットは 内部オブジェクトへの参照を保持しますが、Tkinterはそのオブジェクトを参照しません。 Pythonのガベージコレクタ がTkinterオブジェクトを破棄すると、TkinterはTkにイメージを解放するように指示します。 しかし、画像はウィジェットによって使用されているので、Tkはそれを破壊しません。完全に ではありません。それはちょうどそれが完全に 透明にする...

ソリューションは、ウィジェット属性に取り付けることにより、例えば、Tkinterの オブジェクトへの参照を保持することを確認することで、画像をブランク:

photo = PhotoImage(...) 

label = Label(image=photo) 
label.image = photo # keep a reference! 
label.pack() 

表示する必要がある画像ごとに行う必要があります

+0

tkinterインターフェイスは、使用しているように画像を正しく処理していますPythonガベージコレクションは、[ドキュメント](https://docs.python.org/2/library/tkinter.html#images)に基づいて意図された動作です:_最後のPythonのイメージオブジェクトへの参照が削除されると、イメージデータも削除され、_ –

関連する問題

 関連する問題