IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

afficher une image lorsque je clique sur un bouton


Sujet :

Tkinter Python

  1. #1
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut afficher une image lorsque je clique sur un bouton
    Bonjour , j'ai une grande image et je l'ai découpé en 3 pour pouvoir l'afficher dans les dimensions voulues . Au depart j'affiche la premiére image et un bouton propose d'afficher la seconde , un autre la premiére et un autre la troisiéme . J'aimerais lorsque qu'on clique sur le bouton que l'ancienne image qui était affiché soit supprimé pour laissé place à celle qui doit être affiché (sinon je me retrouve avec deux images dans la fenétre) . Voilà ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    def affi(i):
                 photo=PhotoImage(file=i)
                 labl = Label(page, image=photo)
                 labl.image=photo
                 labl.pack() ;
     
     
    but1=Button(page,text="Etape 1",command=affi("1.gif"));
    but1.pack(side="left")
    but2=Button(page,text="Etape 2",command=affi("2.gif"));
    but2.pack(side="left")
    but3=Button(page,text="Etape 3",command=affi("3.gif"));
    but3.pack(side="left")
    Probléme 1 : Il m'affiche les trois images sans même que je ne clique sur un des boutons

    Probléme 2 : Je ne vois pas comment faire pour supprimer l'image présente avant d'en afficher une autre .


    Merci de votre aide )

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Salut,

    Problème n° 1: normal, tu as mis des arguments aux fonctions appelées.

    Pas bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    but1=Button(page,text="Etape 1",command=affi("1.gif"))
    Bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    but1 = Button(page,text="Etape 1", command=affi)
    Si, éventuellement, tu dois vraiment passer des arguments à ta fonction (cas assez rares en définitive) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    but1 = Button(page,text="Etape 1", command=lambda who=1: affi(who))
    Problème n° 2 : il y a longtemps que je n'ai plus utilisé Tk, mais il me semble que pour des images, j'utilisais un canevas et pour le changement d'image je faisait simplement :

    canvas.destroy()

    et je réinstanciais un nouveau canevas pour l'image suivante, je suppose que les labels ont aussi une méthode destroy().

  3. #3
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Juste un petit détail :

    Je ne trouve pas que détruire le Widget soit une bonne idée. Cela reviens à un forget du géométry manager (pack, grid, place) et bien que cela fonctionne dans le cadre d'un code simple cela risque de donner un drôle de résultat dans une interface plus complète.

    Pour ce qui est de privilégié le Canvas dans le cadre d'une image c'est a voir.
    Dans l'exemple suivant au centre c'est un Canvas et pour les deux barres c'est des Label.

    A chacun son utilité.

    Dans le cadre de ton code j'utiliserai plutôt lambda :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from Tkinter import *
     
    def affi(i):
        photo=PhotoImage(file=i)
        labl.config(image=photo) # Ecrase labl.image donc pas besoin de faire un delete ou autre.
        labl.image=photo # Garder la référence
     
    page=Tk()
    labl = Label(page) # Il est aussi possible (et préférable) de mettre 1.gif dés le départ pour que le pack prenne compte de la géométrie.
    labl.pack()    
    Button(page,text="Etape 1",command=lambda: affi("1.gif")).pack(side="left") # Pas besoin de nommer tes Widgets Button si tu
    Button(page,text="Etape 2",command=lambda: affi("2.gif")).pack(side="left") # N'en a pas besoin par la suite.
    Button(page,text="Etape 3",command=lambda: affi("3.gif")).pack(side="left")
    page.mainloop()
    Sinon plutôt qu'un destroy il existe le delete(ALL) pour le Canvas.

    @+

    Note pour VinsS : J'utilise souvent lambda dans mes command. C'est à mon avis un outil presque indispensable avec la class variable (hors threads pour celle ci mais c'est plus une généralité tkinter)
    Merci d'utiliser le forum pour les questions techniques.

  4. #4
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Re,

    A noter que tu utilise from Tkinter import * et c'est commun (et pratique) au début.
    Les imports du style from <module> import * sont source à problèmes et je te conseillerai de commencer a t'habituer à l'utilisation de import <module> ou import <module> as.
    Ce qui donne pour ton code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import Tkinter
     
    def affi(i):
        photo=Tkinter.PhotoImage(file=i)
        labl.config(image=photo) # Ecrase labl.image donc pas besoin de faire un delete ou autre.
        labl.image=photo # Garder la référence
     
    page=Tkinter.Tk()
    labl = Tkinter.Label(page) # Il est aussi possible (et préférable) de mettre 1.gif dés le départ pour que le pack prenne compte de la géométrie.
    labl.pack()    
    Tkinter.Button(page,text="Etape 1",command=lambda: affi("1.gif")).pack(side="left") # Pas besoin de nommer tes Widgets Button si tu
    Tkinter.Button(page,text="Etape 2",command=lambda: affi("2.gif")).pack(side="left") # N'en a pas besoin par la suite.
    Tkinter.Button(page,text="Etape 3",command=lambda: affi("3.gif")).pack(side="left")
    page.mainloop()
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    import Tkinter as Tk
     
    def affi(i):
        photo=Tk.PhotoImage(file=i)
        labl.config(image=photo) # Ecrase labl.image donc pas besoin de faire un delete ou autre.
        labl.image=photo # Garder la référence
     
    page=Tk.Tk()
    labl = Tk.Label(page) # Il est aussi possible (et préférable) de mettre 1.gif dés le départ pour que le pack prenne compte de la géométrie.
    labl.pack()    
    Tk.Button(page,text="Etape 1",command=lambda: affi("1.gif")).pack(side="left") # Pas besoin de nommer tes Widgets Button si tu
    Tk.Button(page,text="Etape 2",command=lambda: affi("2.gif")).pack(side="left") # N'en a pas besoin par la suite.
    Tk.Button(page,text="Etape 3",command=lambda: affi("3.gif")).pack(side="left")
    page.mainloop()
    @+ et bon code
    Merci d'utiliser le forum pour les questions techniques.

  5. #5
    Membre habitué
    Avatar de moithibault
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2009
    Messages : 124
    Points : 142
    Points
    142
    Par défaut
    Merci beaucoup pausekawa et les autres (:

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 09/02/2013, 23h05
  2. [Flex4] Affichage d'une page lorsqu'on clique sur le bouton
    Par web.ikram dans le forum Flex
    Réponses: 5
    Dernier message: 06/02/2011, 00h14
  3. [JPanel] inserer une image quand on clique sur un bouton
    Par the_ugly dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 19/12/2006, 13h41
  4. Afficher une TextArea quand on clique sur un bouton
    Par Goozisan dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 26/11/2006, 20h44
  5. Afficher une image lorsque la souris passe sur un lien
    Par cyrillique dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 18/09/2006, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo