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

Bibliothèques tierces Python Discussion :

tkinter et gif qui reste fixe


Sujet :

Bibliothèques tierces Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut tkinter et gif qui reste fixe
    Bonjour,

    je suis entrain de realiser un projet en python3.4 avec tkinter

    j'aimerai afficher un gif annimé , mais l'image reste fixe, quelqun saurai pourquoi ?

    voila mon code


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    from tkinter import *
    import time
     
    Windows = Tk()
     
    photo = PhotoImage(file="load.gif")
    canvas = Canvas(Windows, width=350,height=200,bg='white')
    canvas.create_image(0,0,anchor='nw', image=photo)
    canvas.pack(side='top', fill='both', expand='yes')
    Windows.mainloop()
    merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    Citation Envoyé par vodkline Voir le message
    j'aimerai afficher un gif annimé , mais l'image reste fixe, quelqun saurai pourquoi ?
    Un fichier GIF "animé" contient plusieurs frames et une information disant combien de temps afficher la frame courante avant de passer à la suivante. Dit autrement, y a tout pour animer le GIF mais, avec tkinter, il faut quand même réaliser la mécanique qui fasse l'animation.
    De plus, le format de ces fichiers GIF étant particulier, il faut utiliser PIL/Pillow pour lire les différentes "frames" ou PhotoImage(file="load.gif", format="gif -index 2"). In fine, vous avez une liste d'images qu'il va falloir afficher successivement.
    Rien de bien compliqué d'autant que vous trouverez plein d'exemples de code sur Internet.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    justement , je n’arrive pas a mettre en oeuvre cela.
    je ne comprend pas comment cela fonctionne.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    j'ai modifier comme ceci mais apres je suis coincé

    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
     
    #!/usr/bin/env python3.4                                                
    # -*- coding: utf-8 -*-                                                 
     
     
    from tkinter import *
    import time
     
    Windows = Tk()
     
    photo = PhotoImage(file="load.gif", format="gif -index 2")
    canvas = Canvas(Windows, width=350,height=200,bg='white')
    canvas.create_image(0,0,anchor='nw', image=photo)
    canvas.pack(side='top', fill='both', expand='yes')
    Windows.mainloop()

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 281
    Points : 36 768
    Points
    36 768
    Par défaut
    Salut,

    S'il y a une liste d'image dans votre GIF, il faut les lire une après l'autre. En écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    photo = PhotoImage(file="load.gif", format="gif -index 2")
    vous ne lisez que la troisième (on compte à partir de zéro).

    Je conçois qu'écrire une boucle while, construire une chaine de caractère avec un entier en paramètre, soit compliqué... Mais si vous ne maîtrisez pas encore ces bases là, il faut peut être encore passer du temps dans les tutos.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    Merci de ton aide , cependant j'ai encore un soucis
    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
     
     #!/usr/bin/env python3.4                                                 
     # -*- coding: utf-8 -*-                                                  
     
     
     from tkinter import *
     import time
     
     Windows = Tk()
     
     i = 0
     
     while i < 10:
         photo = PhotoImage(file="load.gif", format="gif -index i")
         canvas = Canvas(Windows, width=350,height=200,bg='white')
         canvas.create_image(0,0,anchor='nw', image=photo)
         canvas.pack(side='top', fill='both', expand='yes')
         i = i + 1
     i = 0
     Windows.mainloop()
    il semble ne pas vouloir de mon i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "./test.py", line 13, in <module>
        photo = PhotoImage(file="load.gif", format="gif -index i")
      File "/usr/lib/python3.4/tkinter/__init__.py", line 3419, in __init__
        Image.__init__(self, 'photo', name, cnf, master, **kw)
      File "/usr/lib/python3.4/tkinter/__init__.py", line 3375, in __init__
        self.tk.call(('image', 'create', imgtype, name,) + options)
    _tkinter.TclError: expected integer but got "i"

  7. #7
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par vodkline Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         photo = PhotoImage(file="load.gif", format="gif -index i")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Traceback (most recent call last):
      File "./test.py", line 13, in <module>
        photo = PhotoImage(file="load.gif", format="gif -index i")
      File "/usr/lib/python3.4/tkinter/__init__.py", line 3419, in __init__
        Image.__init__(self, 'photo', name, cnf, master, **kw)
      File "/usr/lib/python3.4/tkinter/__init__.py", line 3375, in __init__
        self.tk.call(('image', 'create', imgtype, name,) + options)
    _tkinter.TclError: expected integer but got "i"
    Bonjour,
    Ainsi que le dit wiztricks, le tutoriel est vraiment indispensable.
    Le "index i" est une chaîne de caractère, pas une variable! Et le message le dit!!!
    Il faut construire cette chaîne!
    Clodion

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> i = 12
    >>> var = "index " + str(i)
    >>> var
    'index 12'
    >>>

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    Meerci beaucoup je commence a comprendre
    j'ai cependant un dernier soucis ,
    les canvas s'affiche l'un en dessous de l'autre ,
    j'aimerai n'avoir qu'un canevas et que le suivant remplace l'actuelle

    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
     
     #!/usr/bin/env python3.4                                                    
     # -*- coding: utf-8 -*-                                                     
     
     
     from tkinter import *
     import time
     
     Windows = Tk()
     
     i = 0
     
     while i < 8:
         number_image = "gif -index " + str(i)
         photo = PhotoImage(file="load.gif", format=number_image)
         canvas = Canvas(Windows, width=350,height=200,bg='white')
         canvas.create_image(0,0,anchor='nw', image=photo)
         canvas.pack(side='top', fill='both', expand='yes')
         i = i + 1
     i = 0
     Windows.mainloop()

  9. #9
    Membre éprouvé
    Homme Profil pro
    Aucune activité
    Inscrit en
    Novembre 2011
    Messages
    505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Aucune activité

    Informations forums :
    Inscription : Novembre 2011
    Messages : 505
    Points : 926
    Points
    926
    Par défaut
    Citation Envoyé par vodkline Voir le message
    les canvas s'affiche l'un en dessous de l'autre ,
    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
     
     #!/usr/bin/env python3.4                                                    
     # -*- coding: utf-8 -*-                                                     
     
     
     from tkinter import *
     import time
     
     Windows = Tk()
     
     i = 0
     
     while i < 8:
         number_image = "gif -index " + str(i)
         photo = PhotoImage(file="load.gif", format=number_image)
         canvas = Canvas(Windows, width=350,height=200,bg='white')
         canvas.create_image(0,0,anchor='nw', image=photo)
         canvas.pack(side='top', fill='both', expand='yes')
         i = i + 1
     i = 0
     Windows.mainloop()
    Bonsoir,
    Là, c'est un problème de compréhension du déroulé des instructions.
    À chaque itération, le script demande la création d'un nouveau "Canvas". Il est donc normal qu'il y ait huit "Canvas" distincts.
    => Le "Canvas" ne doit être créé qu'une seule fois.

    Il faut que "tkinter" fasse une mise à jour afin que l'image soit visible (sinon, seule la dernière image sera affichée).
    => une solution, mais ce n'est pas la meilleure, est de demander une mise à jour à chaque itération.
    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 *
     
    fen = Tk()
     
    can = Canvas(fen, width=350, height=200, bg='white')
    can.pack(side='top', fill='both', expand='yes')
    photo = PhotoImage(file="load.gif")
    can.create_image(0,0,anchor='nw', image=photo)
     
    for ind in range(8):
        photo.configure(format="gif -index " + str(ind))
        can.update_idletasks()
     
    fen.mainloop()
    Clodion
    PS:
    - une variable avec une majuscule est une mauvaise idée,
    - un espace au début de chaque ligne aussi.

Discussions similaires

  1. [WD16] GIF qui reste statique lors d'une requete
    Par EriCstoFF dans le forum WinDev
    Réponses: 19
    Dernier message: 09/03/2015, 09h48
  2. Formule qui reste Fixe
    Par Didpa dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/06/2012, 21h03
  3. panel qui reste fixe
    Par couse1 dans le forum JSF
    Réponses: 6
    Dernier message: 19/07/2011, 16h39
  4. Rollover qui s'affiche si la souris reste fixe
    Par zaldiko dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 20/06/2008, 20h25
  5. barre des taches qui reste apparente
    Par arfy dans le forum Windows XP
    Réponses: 5
    Dernier message: 25/11/2005, 08h33

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