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

Python Discussion :

Concernant Photoimage dans tkinter


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 38
    Par défaut Concernant Photoimage dans tkinter
    Bonjour,

    En premier lieu, je voudrais savoir si il y a une différence de résultat entre ces deux bouts de code :

    1)

    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
     
     
    self.filename = ["{path}image1, {path}image2]
    self.image_index  = 0
     
    self.images = [
                tk.PhotoImage(file=f, master=self)
                for f in filename
            ]
     
        def update_image(self):
            if self.images:
                image = self.images[self.image_index]
                self.canvas_logo.itemconfigure(self.image_container, image=image)
                self.canvas_logo.pack()
     
        def on_update(self):
            if self.images:
                self.image_index += 1
                self.image_index %= len(self.images)
                self.update_image()
                self.after(500, self.on_update)
    2)
    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
     
     
    self.filename = ["{path}image1, {path}image2]
    self.image_index  = 0
     
        def update_image(self):
            if self.filename:
                image = tk.PhotoImage(file=filename[self.image_index], master=self)
                self.canvas_logo.itemconfigure(self.image_container, image=image)
                self.canvas_logo.pack()
     
        def on_update(self):
            if self.filename:
                self.image_index += 1
                self.image_index %= len(self.filename)
                self.update_image()
                self.after(500, self.on_update)
    -Si la réponse est non il n'y a pas de différence alors j'aimerai savoir pourquoi =>:

    Dans le 1er code l'image change bien alors que dans le 2e code aucune image s'affiche?

    -Si la réponse est oui il y a une différence alors j'aimerai savoir laquelle svp.

    Merci par avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Salut,

    Une Image tkinter doit restée référencée pour être visible lorsqu'on l'affiche.
    Une façon pour y arriver est d'avoir ces Images dans une liste associée à une variable globale (ce que vous avez fait).

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

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 38
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,


    Une façon pour y arriver est d'avoir ces Images dans une liste associée à une variable globale (ce que vous avez fait).

    - W
    Quand vous dites ces Images vous voulez dire des instances Photoimage avec ces images en attribut c'est ca? Donc le fait de générer directement une "double référence d'instance" de Photoimage (self.images[0] et self.images[1]) et les stocker dans une liste dès le départ dans le constructeur permet de mémoriser indirectement les images une seule fois pour pouvoir les récupérer quand on veut. Donc dans une classe, si on veut solliciter des fichiers plus tard pour les manipuler, il est préférable de générer des instances avec ces fichiers en arguments, plutôt que de récupérer les fichiers en dur c'est ca?...

    Merci.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 683
    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 683
    Par défaut
    Citation Envoyé par pycarpe Voir le message
    Quand vous dites ces Images vous voulez dire des instances Photoimage avec ces images en attribut c'est ca?
    PhotoImage hérite d'Image (dans tkinter) et la documentation Python parle d'Image.

    Citation Envoyé par pycarpe Voir le message
    Donc le fait de générer directement une double instance de Photoimage et les stocker dans une liste dès le départ dans le constructeur permet de mémoriser indirectement les images une seule fois pour pouvoir les récupérer quand on veut.
    Un nom de fichier n'est qu'une chaîne de caractères grace à laquelle on va fabriquer une instance de l'objet PhotoImage qui est une Image.

    Citation Envoyé par pycarpe Voir le message
    Donc dans une classe, si on veut solliciter des fichiers plus tard pour les manipuler, il est préférable de générer des instances avec ces fichiers en arguments, plutôt que de récupérer les fichiers en dur c'est ca?...
    Pensez "objets".
    Un objet va être créé, modifié (si mutable) et détruit.
    On parle de cycle de vie et de durée de vie de l'objet.
    Avec Python, un objet sera détruit lorsqu'il n'y aura plus de référence dessus (pour récupérer la mémoire).
    Et si on vous dit qu'il faut garder une référence à l'instance de PhotoImage pour que l'objet ne soit pas détruit (et que l'image s'affiche)... çà n'a rien à voir avec le fichier qui a servi à fabriquer cet objet.

    Dans votre code, on pourrait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def update_image(self):
            if self.filename:
                image = self.image = tk.PhotoImage(file=filename[self.image_index], master=self)
                self.canvas_logo.itemconfigure(self.image_container, image=image)
    à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        def update_image(self):
            if self.filename:
                image = tk.PhotoImage(file=filename[self.image_index], master=self)
                self.canvas_logo.itemconfigure(self.image_container, image=image)
    self.image =... ajoute une référence dans l'instance correspondant à "self" objet qu'on suppose rester "vivant" (i.e. référencé) après l'exécution de la méthode update_image.

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

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2021
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2021
    Messages : 38
    Par défaut
    Merci beaucoup j'ai saisie le principe. Maintenant il faut que je pratique encore et encore pour être à l'aise avec tout ca.
    Intéressant en à savoir en tout cas même si je vais quand même utiliser la première méthode en déclarant l'objet directement dans le constructeur, c'est plus lisible et propre.
    C'est résolu pour moi. Merci encore et Bonne soirée!

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

Discussions similaires

  1. Boucles dans Tkinter
    Par Nightmare Theater dans le forum Tkinter
    Réponses: 3
    Dernier message: 28/02/2010, 14h54
  2. Probleme avec un print dans Tkinter
    Par Patatarte dans le forum Tkinter
    Réponses: 2
    Dernier message: 21/11/2009, 11h51
  3. Text vertical dans Tkinter canvas text
    Par jcgarreau dans le forum Tkinter
    Réponses: 4
    Dernier message: 15/08/2009, 00h29
  4. Progress Bar dans Tkinter ou autre module
    Par will97 dans le forum Tkinter
    Réponses: 3
    Dernier message: 16/03/2007, 23h11
  5. une question concernant à Timer dans C++.2005
    Par lzw1015bean dans le forum VC++ .NET
    Réponses: 1
    Dernier message: 01/08/2006, 12h14

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