J'ai chargé une image sur l'étiquette tkinter et cette image est affichée dans cette étiquette.Lorsque j'appuie sur le bouton, je dois changer cette image.Lorsque le bouton est enfoncé, l'ancienne image a disparu mais la nouvelle image n'est pas affichée.Mon code est

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()
5
user6745741 15 janv. 2017 à 06:15

2 réponses

Meilleure réponse

Les modifications suivantes ont été apportées:

  1. J'ai organisé la mise en page de votre code et simplifié sa syntaxe dans la mesure du possible. Celles-ci sont destinées à faciliter la lecture de votre code.
  2. Généralement, nous faisons des objets PIL un sous-ensemble / enfants de tk. Tant qu'il fait partie de root (c'est-à-dire qu'il s'agit d'un enfant de la racine ou de l'un de ses widgets enfants), vos objets PIL fonctionneront.

Votre code de travail est indiqué ci-dessous:

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()
4
Sun Bear 16 janv. 2017 à 19:07

Dans def change_pic(labelname), vous devez ajouter labelname.photo = photo1 pour vous assurer que photo1 n'est pas récupéré.

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

P.S. On dirait que labelname.photo = photo1 et labelname.image = photo1 fonctionnent.

Consultez ceci pour plus de détails: http://effbot.org/tkinterbook/label.htm

Vous pouvez utiliser l'étiquette pour afficher les objets PhotoImage et BitmapImage. Lors de cette opération, assurez-vous de conserver une référence à l’objet image pour éviter qu’il ne soit récupéré par l’allocateur de mémoire de Python. Vous pouvez utiliser une variable globale ou un attribut d'instance, ou plus simplement, ajoutez simplement un attribut à l'instance de widget.

5
Shane 15 janv. 2017 à 05:42