OVH Cloud OVH Cloud

changer une image dans un widget canva

1 réponse
Avatar
oliv
Je travaille sur un programme pour une école. Programme dans lequel une nouvelle image doit être affichée à chaque réponse de l'élève (réponse par un clic sur un bouton

Mais voilà, autant l'image initiale se charge au démarrage, autant il est impossible de la changer
j'ai essayé de changer la variable donnant le nom de l'image en appellant une fonction
( dans cette fonctions sont définies trois variables qui correspondent aux centaines, dizaines unités, qui doivent etre représentées chacune par l'image affichée)

def changlab()

global cen
global di
global uni
global photocen

cent= random.randint(1,9
diz= random.randint(0,9
unit= random.randint(0,9
nb=cent*100 + diz*10 + uni
print n

if cent ==1
photocent="cent.gif
if cent ==2
photocent="deux-cents.gif
if cent ==3
photocent="trois-cents.gif
if cent ==4
photocent="quatre-cents.gif
if cent ==5
photocent="cinq-cents.gif
if cent ==6
photocent="six-cents.gif
if cent ==7
photocent="sept-cents.gif
if cent ==8
photocent="huit-cents.gif
if cent ==9
photocent="neuf-cents.gif
mais l'image ne change pas et reste celle chargée au départ

ensuite j'ai essayé de redéfinir le canvas complet dans la fonction, mais là plus rien ne marche !!!!

def changlab()

global cen
global di
global uni
global photocen

cent= random.randint(1,9
diz= random.randint(0,9
unit= random.randint(0,9
nb=cent*100 + diz*10 + uni
print n

if cent ==1
photocent="cent.gif
if cent ==2
photocent="deux-cents.gif
if cent ==3
photocent="trois-cents.gif
if cent ==4
photocent="quatre-cents.gif
if cent ==5
photocent="cinq-cents.gif
if cent ==6
photocent="six-cents.gif
if cent ==7
photocent="sept-cents.gif
if cent ==8
photocent="huit-cents.gif
if cent ==9
photocent="neuf-cents.gif

# création d'un widget 'Canvas' contenant une image bitmap
can4 = Canvas(cadreentree4, width =140, height =200
photo4 = PhotoImage(file ="trente.gif"
item = can4.create_image(70, 90, image =photo4
can4.pack(

--
oliv

-----------------------------------------------------------------------
Voir theme: http://www.frbox.net/viewtopic-514206.htm

Envoyé de http://www.frbox.ne

1 réponse

Avatar
F. Petitjean

Je travaille sur un programme pour une école.

Mais voilà, autant l'image initiale se charge au démarrage, autant il est impossible de la changer.
j'ai essayé de changer la variable donnant le nom de l'image en appellant une fonction :
( dans cette fonctions sont définies trois variables qui correspondent aux centaines, dizaines unités, qui doivent etre représentées chacune par l'image affichée) :


def changlab():
Ajoutez ici la « docstring » de cette fonction.


global cent
global diz
global unit
global photocent
Un conseil : évitez le plus possible d'utiliser « global ».


cent= random.randint(1,9)
diz= random.randint(0,9)
unit= random.randint(0,9)
nbÎnt*100 + diz*10 + unit
print nb

if cent ==1:
photocent="cent.gif"
if cent ==2:
photocent="deux-cents.gif"
if cent ==3:
photocent="trois-cents.gif"
if cent ==4:
photocent="quatre-cents.gif"
if cent ==5:
photocent="cinq-cents.gif"
if cent ==6:
photocent="six-cents.gif"
if cent ==7:
photocent="sept-cents.gif"
if cent ==8:
photocent="huit-cents.gif"
if cent ==9:
photocent="neuf-cents.gif"
Cette suite de « if » est bien inutile :

photocent = ("cent.gif", "deux-cents.gif", ...., "neuf-cents.gif")[cent]
mais l'image ne change pas et reste celle chargée au départ.
Vous ne nous indiquez pas comment vous chargez ou changez une image,

c'est ce code là qui nous intéresse.

ensuite j'ai essayé de redéfinir le canvas complet dans la fonction, mais là plus rien ne marche !!!! :

snip



# création d'un widget 'Canvas' contenant une image bitmap :
can4 = Canvas(cadreentree4, width 0, height 0)
photo4 = PhotoImage(file ="trente.gif")
item = can4.create_image(70, 90, image =photo4)
can4.pack()

Il semblerait que vous utilisiez Tkinter (pourquoi ne pas l'avoir dit

dès le début ?) Il y a un piège bien vonnu dans la gestion des images
dans Tkinter : il faut absolument programmer en gardant une référence
aux données de l'image : ici la variable photo4 est passée à la trappe
par le ramasse miettes dès la sortie de la fonction (*) et le pauvre
canvas ne peut pas retrouver les paramètres de l'image à afficher lors
que le système lui demande de dessiner la fenêtre.
C'est une sorte de piège car pour les widgets (cadreentree4 ou can4
..) garder une référence Python n'est pas nécessaire, c'est automatique.

Je vous conseille donc de créer une classe représentant la fenêtre et
de conserver les images comme attributs. N'hésitez pas à poser des
questions supplémentaires si cela n'est pas clair pour vous.

Note
(*) en anglais garbage collected.