Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/05/2008, à 11:14

arnaud_d

[R][Python - Débutant] Petit problème avec images dans un canvas

Bonjour à tous !

Je me suis mis au Python il y a quelques jours en lisant le cours de Gérard Swinnen qui est excellent. J'en suis à la moitié mais j'ai déjà essayé de faire quelques programmes.

J'ai essayé de faire un mini programme pour m'entrainer : le but est de créer deux boutons et un canvas dans lequel apparait une image. Au démarrage du prog l'image est le logo Pyhon, mais si l'utilisateur clique sur l'un des boutons, l'image associée à ce bouton doit s'afficher.

# -*- coding:Utf-8 -*-
# Changer d'image
# 10 Mai 2008

from Tkinter import *

def changer_photo(n):
    if n==1:
        photo=PhotoImage(file='1.gif')
    elif n==2:
        photo=PhotoImage(file='2.gif')
    else:
        photo=PhotoImage(file='python.gif')
    item = can.create_image(80,80,image=photo)


fenetre = Tk()

can=Canvas(fenetre,width=160,height=160,bg='white')
photo=PhotoImage(file='python.gif')
item = can.create_image(80,80,image=photo)
can.pack(side=LEFT)

Button(fenetre,text='Quitter',command=fenetre.quit).pack(side=BOTTOM)
Button(fenetre,text='Photo 1',command=changer_photo(1)).pack()
Button(fenetre,text='Photo 2',command=changer_photo(2)).pack()

fenetre.mainloop()

Mais voilà : ça ne marche pas. La première image (python.gif) est bien chargée mais si je clique sur un bouton, l'image disparait mais aucune ne la remplace. J'ai ajouté des print "Je suis dans le cas n==1" ou "je suis dans le cas n==2" pour débuger, ces chaines s'affichent bien dans le terminal, ce qui prouve que l'appel de changer_photo marche.

Tout se passe comme si, dans changer_photo, la commande

photo=PhotoImage(file='1.gif')

s'executait mais pas

item = can.create_image(80,80,image=photo)

J'ai pensé que le problème venait du fait que can n'était pas globale mais même en ajoutant global can ça ne marche pas. En effet, si lance le programme sans la dernière ligne et et que je tappe dans le terminal

photo=PhotoImage(file='1.gif')
item = can.create_image(80,80,image=photo)

là ça marche très bien.

Est-ce que l'un ou l'une d'entre vous vois l'erreur ?

Merci beaucoup.

Arnaud

Dernière modification par arnaud_d (Le 11/05/2008, à 13:09)

Hors ligne

#2 Le 11/05/2008, à 11:20

Abu

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

A mon avis le pb vient que tu recrée à chaque fois l'image
Essaie de remplacer le can.create_image(...) de ta fonction par

can.itemconfigure(item,image=photo)

Je pense que ça devrait passer

Edit : Il me semble qu'on ne peut pas passer de paramètres dans une événement (à confirmer)
Donc le pb pourrait venir du command=changer_photo(1) dans ton bouton

Bon courage

Abu

Dernière modification par Abu (Le 11/05/2008, à 11:25)

Hors ligne

#3 Le 11/05/2008, à 11:36

arnaud_d

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

Bonjour Abu,

Je suis tombé sur ton topic en cherchant une solution à mon problème et j'ai essayé ton ping : tu m'impressionne ! C'est vraiment génial et je me dis vraiment que sur terre il existe deux catégories de débutants big_smile

Alors j'ai essayé ce que tu m'as dit :

# -*- coding:Utf-8 -*-
# Changer d'image
# 10 Mai 2008

from Tkinter import *

def changer_photo(n):  
    if n==1:
        photo=PhotoImage(file='1.gif')
    elif n==2:
        photo=PhotoImage(file='2.gif')
    else:
        photo=PhotoImage(file='python.gif')
    can.itemconfigure(item,image=photo)

fenetre = Tk()

can=Canvas(fenetre,width=160,height=160,bg='white')
photo=PhotoImage(file='python.gif')
item = can.create_image(80,80,image=photo)
can.pack(side=LEFT)

Button(fenetre,text='Quitter',command=fenetre.quit).pack(side=BOTTOM)
Button(fenetre,text='Photo 1',command=changer_photo(1)).pack()
Button(fenetre,text='Photo 2',command=changer_photo(2)).pack()

fenetre.mainloop()

Mais dans ce cas  même la première image ne s'affiche pas.

J'ai vu ensuite ton edit : je crois que c'est possible car j'ai fait un message de debug dans la fonciton pour visualiser l'argument et il me l'affiche bien. Quoi qu'il en soit j'ai aussi essayé :

# -*- coding:Utf-8 -*-
# Changer d'image
# 10 Mai 2008

from Tkinter import *

def changer_photo():  
    photo=PhotoImage(file='1.gif')
    can.itemconfigure(item,image=photo)

fenetre = Tk()

can=Canvas(fenetre,width=160,height=160,bg='white')
photo=PhotoImage(file='python.gif')
item = can.create_image(80,80,image=photo)
can.pack(side=LEFT)

Button(fenetre,text='Quitter',command=fenetre.quit).pack(side=BOTTOM)
Button(fenetre,text='Photo 1',command=changer_photo).pack()

fenetre.mainloop()

et là pareil : image blanche [edit : quand je clique sur le bouton, sinon la première (le logo) s'affiche bien] (et ce n'est pas un problème de fichier : j'arrive très bien a faire afficher 1.gif si je ne passe pas par la fonction).

Merci encore pour ton aide.

Dernière modification par arnaud_d (Le 11/05/2008, à 11:45)

Hors ligne

#4 Le 11/05/2008, à 11:55

arnaud_d

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

J'ai commençé à trouver une piste :
http://www.generation-nt.com/reponses/c … 952.html#1

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 photo 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.

Comment faire pour rendre cette référence "globale"... Dans le site ils parlent de classe mais y'a sans doute plus simple...

Dernière modification par arnaud_d (Le 11/05/2008, à 11:55)

Hors ligne

#5 Le 11/05/2008, à 12:15

Abu

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

Merci pour le compliment smile (mais j'avais déjà pas mal programmé avant, il y a....longtemps, et je m'y remet avec Python que je ne connaissais pas, donc je débute en Python mais pas en programmation)

Pour ton pb alors là je vois pas

Peut-être que tu devrais tout mettre dans une classe. Regarde le source de mon casse-briques pour faire un truc du genre :

from Tkinter import *

class Application:
    def __init__(self):
        self.fenetre = Tk()
        self.can=Canvas(self.fenetre,width=160,height=160,bg='white')
        self.photo=PhotoImage(file='python.gif')
        self.item = self.can.create_image(80,80,image=photo)
        self.can.pack(side=LEFT)
        Button(self.fenetre,text='Quitter',command=self.fenetre.quit).\
            pack(side=BOTTOM)
        Button(self.fenetre,text='Photo 1',command=self.changer_photo).pack()  
    
    def change_photo(self):
         self.photo=PhotoImage(file='1.gif')
         self.can.itemconfigure(item,image=photo)

app=Application()
app.fenetre.mainloop()

## J'espère que j'ai pas oublié de self.  :p
## edit : Ah ben si :p, j'espère que c'est bon là...

Tiens moi au jus

Abu(ntu)

Edit : Arf le temps de taper j'avais pas vu ton message....
Alors là sans classe je sais pas...(mais c'est vraiment pas dur, faut juste mettre des self. de partout

Dernière modification par Abu (Le 11/05/2008, à 12:19)

Hors ligne

#6 Le 11/05/2008, à 13:09

arnaud_d

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

Nickel !

Franchement merci. Et s'il faut une classe, il la faut, c'est très bien. Je suis pas arrivé à ce chapitre (même si j'ai déjà vu ce que c'était en C++ (oui moi aussi j'ai déjà programmé lol)).

Il y avait deux ou trois erreur dans ton code (photo au lieu de self.photo) mais il marche vraiment très bien.

from Tkinter import *

class Application:
    def __init__(self):
        self.fenetre = Tk()
        self.can=Canvas(self.fenetre,width=160,height=160,bg='white')
        self.photo=PhotoImage(file='python.gif')
        self.item = self.can.create_image(80,80,image=self.photo)
        self.can.pack(side=LEFT)
        Button(self.fenetre,text='Quitter',command=self.fenetre.quit).\
            pack(side=BOTTOM)
        Button(self.fenetre,text='Photo 1',command=self.changer_photo).pack()  
    
    def changer_photo(self):
         self.photo=PhotoImage(file='1.gif')
         self.can.itemconfigure(self.item,image=self.photo)

app=Application()
app.fenetre.mainloop()

Merci mille fois et...
... sans doute à bientôt pour d'autre questions big_smile

Arnaud

Edit : qu'est ce que tu utilises pour écrire tes progs ? Moi j'utilise le text editor par défaut sur Ubuntu, mais j'aimerais bien qu'il m'affiche une colonne à gauche avec le nom des fonctions comme avec Notepad++ sou Windows...

Dernière modification par arnaud_d (Le 11/05/2008, à 13:12)

Hors ligne

#7 Le 11/05/2008, à 13:21

Abu

Re : [R][Python - Débutant] Petit problème avec images dans un canvas

Cool que ça marche smile

Pour mon code j'utilise SPE (Stani's Python Editor) que je trouve pas mal, même s'il y a 2 ou 3 trucs qui m'énervent un peu
IDLE à l'air très connu mais je ne l'ai pas testé

Bon courage pour la suite

Abu(ntu)

Hors ligne