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 :

Tkinter, afficher un Gif avec cette architecture. [Fait]


Sujet :

Tkinter Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut Tkinter, afficher un Gif avec cette architecture.
    bonjour,

    afin, de rentrer dans le monde pythonnien. Je code, test, échoue, réussit et upgrade mes lignes. bref.... j'apprends dans mon coin grâce à vos tuto et autres.

    et là, je bloque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    import Tkinter
     
    class premier(Tkinter.Tk):
        def __init__(fen1,parent):
            Tkinter.Tk.__init__(fen1,parent)
            fen1.parent = parent
            fen1.debut()
     
        def debut(fen1):
            fen1.grid()
            # ici je sais coder les Button, Label, faire des labels avec textvariable
            # mais pas afficher un gif dans un label, canvas etc...
     
     
    if __name__ == "__main__":
        app = premier(None)
        app.title('yop')
        app.mainloop()
    en architecturant le codes autrement, j'y parvient.


    si vous pouviez m'aiguiller.

    merci.

  2. #2
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    je n'y parvient toujours pas. quelque chose m'échappe.

    me je suis approprier le code en modifiant le widget Button pas un Label.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import Tkinter 
    root = Tkinter.Tk()
    lblimg = Tkinter.Label(root)
    imgfile = "UBUNTU.gif" 
    img = Tkinter.PhotoImage(file = imgfile)  
    gifsdict={}  			#est-il indispensable si 'nop' sa fonctionne toujours
    gifsdict[imgfile] = img 	#de plus on utilise pas le dico
    lblimg.configure(image=img) 
    lblimg.pack()
    root.mainloop())
    et je l'implémente dans le premier code. ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import Tkinter
     
    class premier(Tkinter.Tk):
        def __init__(fen1,parent):
            Tkinter.Tk.__init__(fen1,parent)
    	fen1.parent = parent
    	fen1.debut()
     
        def debut(fen1):
            fen1.grid()
     
    	lblimg = Tkinter.Label(fen1)
    	imgfile = "UBUNTU.gif" 
    	img = Tkinter.PhotoImage(file = imgfile)  
    	gifsdict={}  			
    	gifsdict[imgfile] = img 	
    	lblimg.configure(image=img) 
    	lblimg.pack()
     
    if __name__ == "__main__":
        app = premier(None)
        app.title('bidule')
        app.mainloop()
    le widget Label est bien dans la fenêtre (fen1) mais pas l'image.

    j'ai tester avec plusieurs implémentations différentes et toujours le mm résultat infructueux.

  4. #4
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    -Le dictionnaire que tu utilises est un dictionnaire locale donc supprimer à la fin de la fonction => il faut qu'il appartienne à la classe
    - le premier argument des fonctions d'une classe est par convention nommé "self". Il est bon de respecter ce nommage

    Comme cecin cela devrait fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import Tkinter
     
    class premier(Tkinter.Tk):
        def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
    	self.parent = parent
    	self.debut()
     
        def debut(self):
            self.grid()
     
    	lblimg = Tkinter.Label(self)
    	imgfile = "UBUNTU.gif" 
    	img = Tkinter.PhotoImage(file = imgfile)  
    	self.gifsdict={}  			
    	self.gifsdict[imgfile] = img 	
    	lblimg.configure(image=img) 
    	lblimg.pack()
     
    if __name__ == "__main__":
        app = premier(None)
        app.title('bidule')
        app.mainloop()

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Par défaut
    ces notions de temporalités des fonctions m'échappe complément. dans un cas, cela fonctionne puis "Pouf" la hiérarchisation fait que ce qui est valable à un niveau, ne l'est plus sur un autre sauf si on lui fait un rappel. (c'est histoire expliquer ce qui m'échappe complètement dans la sémantique Python)

    en tout cas Merci

    PS: pour ceux qui regarde le code fonctionnel et qui ne trouve pas la différence.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    import Tkinter
     
    class premier(Tkinter.Tk):
        def __init__(self,parent):
            Tkinter.Tk.__init__(self,parent)
    	self.parent = parent
    	self.debut()
     
        def debut(self):
            self.grid()
     
    	lblimg = Tkinter.Label(self)
    	imgfile = "UBUNTU.gif" 
    	img = Tkinter.PhotoImage(file = imgfile)  
    	self.gifsdict={}  		#<--- ici rappel d'appartenance à self ( sefl et par autrement pas convention)
    	self.gifsdict[imgfile] = img 	#<---- et ici
    	lblimg.configure(image=img) 
    	lblimg.pack()
     
    if __name__ == "__main__":
        app = premier(None)
        app.title('bidule')
        app.mainloop()

  6. #6
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    Dans Tkinter, l'attribut image d'un label, button, ... n'est en fait qu'un "pointeur" vers l'objet image que tu as créé auparavant. Ce qui fait que si l'objet image est détruit, l'attribut image de ton label ne fait plus référence à quelquechose d'existant.
    C'est pour cela qu'il faut que l'objet image soit contenu dans une variable qui ne soit pas détruit => Il ne faut pas que cela soit dans une variable locale (à une fonction), variable qui est détruite à la fin de l'exécution de celle-ci.

    Effectivement, la FAQ est biaisé (l'utilisation du dictionnaire est inutile ici vu que tout se passe au même niveau), il faudra que je corrige

    Voilà un exemple plus parlant, il suffit de cliquer sur le bouton pour l'afficher

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # -*- coding: cp1252 -*-
    import Tkinter as Tk
     
    def imgaffiche():
        img = Tk.PhotoImage(file = imgfile)  ## Création d'un objet PhotoImage qui reconnait les extensions .gif et .ppm    
        gifsdict[imgfile] = img ##si on commente cette ligne, l'image ne s'affichera pas
        button.configure(image=img) ## Ajout de l'image sur le bouton
     
    root = Tk.Tk()
    button = Tk.Button(text = "toto", command = imgaffiche)
     
    imgfile = "UBUNTU.gif" ## strchemin:str, chemin d'accès à l'image
     
    gifsdict={}  ## Utilisation d'un dictionnaire pour conserver une référence sur la PhotoImage créée
     
    button.pack()
    root.mainloop()

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

Discussions similaires

  1. [Débutant] Affiché un GIF avec CppWebrowser
    Par microbe83 dans le forum C++Builder
    Réponses: 2
    Dernier message: 10/08/2014, 14h33
  2. Tkinter, afficher une image avec une condition
    Par Arancar96 dans le forum Général Python
    Réponses: 1
    Dernier message: 08/05/2014, 17h24
  3. Réponses: 2
    Dernier message: 05/01/2006, 00h08
  4. [Tkinter] Afficher une image autre que gif
    Par mcdonald dans le forum Tkinter
    Réponses: 1
    Dernier message: 26/11/2005, 19h41
  5. Afficher un Gif animée avec VC6
    Par vanitom dans le forum MFC
    Réponses: 2
    Dernier message: 13/10/2005, 17h46

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