2017-01-15 11 views
0

tkinterラベルに画像をロードし、その画像がそのラベルで表示されます。ボタンを押すとその画像を変更する必要があります。ボタンを押すと古い画像が消えますが、新しい画像が表示されていない 私のコードはdef change_pic(labelname)Tkinterボタンを押しても画像が変化しない

import Tkinter as tk 
from PIL import Image, ImageTk 
root = tk.Tk() 

def change_pic(labelname): 
photo1 = ImageTk.PhotoImage(Image.open("demo.jpg")) 
labelname.configure(image=photo1) 
print "updated" 

vlabel=tk.Label(root) 
photo = ImageTk.PhotoImage(Image.open('cardframe.jpg')) 
vlabel.configure(image=photo) 
vlabel.pack() 
b2=tk.Button(root,text="Capture",command=lambda:change_pic(vlabel)) 
b2.pack() 
root.mainloop() 
+0

PILはTkinterのの光画像と同じである場合、私は知りません。 Pythonでは、ガベージコレクションがあり、時にはそれがしたいことをしません。イメージを別のインスタンスとして取得してクラスに適用する必要がある場合、Pythonはイメージインスタンスを収集します。 'image = Image.open(" demo.jpg ")'と 'photo = PhotoImage(image)'が一緒に動くかもしれません。 –

+0

@PrestonHagerは試しましたが動作しません – user6745741

答えて

0

次のように編集が行われました。

  1. 私はあなたのコードのレイアウトを整理して、可能な限りその 構文を簡素化しています。これらは、コードを読みやすくするためのものです。
  2. 一般に、PILオブジェクトをtkのサブセット/子にします。 これはルートの一部分です(つまり、ルート またはその子ウィジェットのいずれかの子です)、PILオブジェクトは機能します。

あなたの作業コードを以下に示します。

import Tkinter as tk 
from PIL import Image, ImageTk 

def change_pic(): 
    vlabel.configure(image=root.photo1) 
    print "updated" 

root = tk.Tk() 

photo = 'cardframe.jpg' 
photo1 = "demo.jpg" 
root.photo = ImageTk.PhotoImage(Image.open(photo)) 
root.photo1 = ImageTk.PhotoImage(Image.open(photo1)) 

vlabel=tk.Label(root,image=root.photo) 
vlabel.pack() 

b2=tk.Button(root,text="Capture",command=change_pic) 
b2.pack() 

root.mainloop() 
1

である、あなたは確かphoto1がガベージコレクトされていない作るためにlabelname.photo = photo1を追加する必要があります。

def change_pic(labelname): 
    photo1 = ImageTk.PhotoImage(Image.open("demo.jpg")) 
    labelname.configure(image=photo1) 
    labelname.photo = photo1 
    print "updated" 

P.S.labelname.photo = photo1labelname.image = photo1の両方のように見えます。

は、詳細については、このチェックアウト:http://effbot.org/tkinterbook/label.htm

あなたは光画像とのBitmapImageオブジェクトを表示するためにラベルを使用することができます。 これを行うときは、イメージオブジェクトへの参照を、 にして、Pythonのメモリ アロケータによってガベージコレクションされないようにしてください。グローバル変数またはインスタンス属性、または を簡単に使用できます。ウィジェットインスタンスに属性を追加するだけです。

関連する問題