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

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 8
    Points
    8
    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 éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 8
    Points
    8
    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 éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    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
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 8
    Points
    8
    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 éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    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()

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    le dico est donc un variable indestructible.

    les IntVar(), DoubleVar() et StringVar() sont elle aussi du mm type?

    pour ton codes exemple avec le bouton: Il y a un truc que je ne pige pas bien.

    est il important de passer pas une variable qui sera détruite pour en construire une indestructible?

    je m'inspire de ton exemple pour valider ce que tu m'as permis de comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import Tkinter as Tk
     
    def imgaffiche():
        button.configure(image=gifsdict["img"])
     
    root = Tk.Tk() #appel fenetre TK()
    button = Tk.Button(text = "toto", command = imgaffiche) #creation Bouton avec texte
     
    gifsdict={}  #creation d'un dico "variable indestructible"
    gifsdict["img"] = Tk.PhotoImage(file = "UBUNTU.gif") #on affecte une fonction à la clef "img du dico (qui sera garder en mémoire grâce aux propriétés des variables dictionnaire)
     
    button.pack() #on "pack le bouton
    root.mainloop()

  8. #8
    Expert éminent sénior
    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 : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    On peut effectivement créer l'image directement dans le conteneur "indestructible".
    Il faut simplement s'assurer de l'existence du conteneur pour que l'image soit bien affichée.

    En revanche, le dictionnaire comme aucune autre variable ne sont pas indestructibles.
    Il faut regarder la portée locale ou globale de l'objet créé: un objet (peu importe l'objet) créé dans une fonction à une portée locale à celle-ci, donc n'existe plus en dehors de celle-ci.
    Dans une classe, si tu créés un attribut (avec le self. ), ton objet image existera tant que son objet parent existera.

    dans l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    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
    img est locale à la fonction (puisque créée à l'intérieur) et ne référence donc plus rien à la sortie de la fonction
    gifsdict étant créé en dehors de la fonction, elle est globale pour celle-ci et continuera d'exister après son exécution

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Guigui_ Voir le message
    [...]

    En revanche, le dictionnaire comme aucune autre variable ne sont pas indestructibles.
    [...]
    Là je bloque sur la tournure (C'est un codage façon Guigui_ ?)

    edit : Jock à part.

    dans le "configure()" la variable "img" fait bien réference à PhotoImage()
    et le dico est une astuce pour quelle soit remise en mémoire.

    MERCI pour le temps que tu as consacré pour me répondre. et pour la qualité de tes réponses.

+ 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