Python : Afficher une image [résolu je crois]

Bonjour.
Si une bonne âme pouvait m’aider…
Je fais un petit script (merci Gérard S.) de rien du tout, mais quelque chose ne fonctionne pas :
Je voudrais que lorsque l’utilisateur entre M dans la troisième Entry une image apparaisse.

J’ai mis en évidence par des ########## les différences entre les trois codes

J’ai fait le test avec une petite ligne en diagonale comme ça :

[code]from tkinter import *
fen1 = Tk()

def garcon(event):
can1.delete(ALL)
#############################################################################
can1.create_line(0,0,160,160,fill=‹ red ›)
#############################################################################

def fille(event):
can1.delete(ALL)

Label(fen1, text = ‹ Nom : ›).grid(row=0,column=0,sticky =E)
Label(fen1, text = ‹ Prénom : ›).grid(row=1,column=0,sticky =E)
Label(fen1, text = ‹ Sexe (M/F) : ›).grid(row=2,column=0,sticky =E)

entr1 = Entry(fen1)
entr2 = Entry(fen1)
entr3 = Entry(fen1)
entr1.grid(row =0, column =1)
entr2.grid(row =1, column =1)
entr3.grid(row =2, column =1)

entr3.bind(‹ M ›,garcon)
entr3.bind(‹ F ›,fille)

can1 = Canvas(fen1, width =160, height =160, bg =‹ black ›)
can1.grid(row =0, column =2, rowspan =3, padx =5, pady =5)

fen1.mainloop()[/code]ça fonctionne une petite ligne se trace.

J’ai aussi placé l’image directement dans le canvas sans que la pression de la touche M soit nécessaire :

[code]from tkinter import *
fen1 = Tk()

def garcon(event):
can1.delete(ALL)
can1.create_line(0,0,160,160,fill=‹ red ›)

def fille(event):
can1.delete(ALL)

Label(fen1, text = ‹ Nom : ›).grid(row=0,column=0,sticky =E)
Label(fen1, text = ‹ Prénom : ›).grid(row=1,column=0,sticky =E)
Label(fen1, text = ‹ Sexe (M/F) : ›).grid(row=2,column=0,sticky =E)

entr1 = Entry(fen1)
entr2 = Entry(fen1)
entr3 = Entry(fen1)
entr1.grid(row =0, column =1)
entr2.grid(row =1, column =1)
entr3.grid(row =2, column =1)

entr3.bind(‹ M ›,garcon)
entr3.bind(‹ F ›,fille)

can1 = Canvas(fen1, width =160, height =160, bg =‹ black ›)
#############################################################################
photo = PhotoImage(file =‹ testgarcon.gif ›)
can1.create_image(80,80, image =photo)
#############################################################################
can1.grid(row =0, column =2, rowspan =3, padx =5, pady =5)

fen1.mainloop()[/code]ça fonctionne aussi.

mais par contre ceci ne fonctionne pas :

[code]from tkinter import *
fen1 = Tk()

def garcon(event):
can1.delete(ALL)
#############################################################################
photo = PhotoImage(file =‹ testgarcon.gif ›)
can1.create_image(80,80, image =photo)
#############################################################################

def fille(event):
can1.delete(ALL)

Label(fen1, text = ‹ Nom : ›).grid(row=0,column=0,sticky =E)
Label(fen1, text = ‹ Prénom : ›).grid(row=1,column=0,sticky =E)
Label(fen1, text = ‹ Sexe (M/F) : ›).grid(row=2,column=0,sticky =E)

entr1 = Entry(fen1)
entr2 = Entry(fen1)
entr3 = Entry(fen1)
entr1.grid(row =0, column =1)
entr2.grid(row =1, column =1)
entr3.grid(row =2, column =1)

entr3.bind(‹ M ›,garcon)
entr3.bind(‹ F ›,fille)

can1 = Canvas(fen1, width =160, height =160, bg =‹ black ›)
can1.grid(row =0, column =2, rowspan =3, padx =5, pady =5)

fen1.mainloop()[/code]et je ne sais pas pourquoi ! :cry:

please Heeeeeeelp !

Merci !

of course si vous testez ces scripts, remplacez ma petite image par un petit gif à vous !

Bon, alors voici la réponse :slight_smile:
l’image étant déclarée à l’intérieure d’une fonction, elle est affichée puis est aussitôt effacée car la case mémoire photo est vidée.
enfin, je crois que c’est ça, non ?

donc la solution consiste à créer la photo en dehors de la procédure.

Je te conseille de lire un peu de doc sur la portée des variables et les closures, en Python, mais aussi ailleurs.
C’est vraiment un point essentiel à bien intégrer.

Edit : la page Wikipedia sur les closures est bien foutue.

merci du conseil !
:smiley: