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 :

Insérer un diagramme MATPLOTLIB dans un widget TEXT de TKINTER


Sujet :

Tkinter Python

  1. #1
    Invité
    Invité(e)
    Par défaut Insérer un diagramme MATPLOTLIB dans un widget TEXT de TKINTER
    Bonsoir,

    Pensez-vous qu'il soit possible d'insérer un diagramme créé au moyen de MATPLOTLIB dans un widget TEXT sans que le texte qui le précède ne soit effacé ?

    En effet, je suis bien parvenu à insérer dans TEXT un Canvas (FigureCanvasTkAgg) mais celui-ci se superpose au texte précédemment insérer.

    Voici le code utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        def visualisation(self, feature, moyenne):
            matplotlib.use('TkAgg') 
            fig = plt.figure(1)
            canvas = FigureCanvasTkAgg(fig, master=self.text0)
            plot_widget = canvas.get_tk_widget()
            plot_widget.grid(row=0, column=0)
            plt.hist(feature)
            plt.title("Histogramme et moyenne")
            plt.axvline(moyenne, color='red', linestyle='dashed', linewidth=1,label = str(moyenne))
            plt.legend(loc='upper right')
            fig.canvas.draw()
    Peut être en récupérant le Canvas pour en faire une image et ainsi l'insérer au moyen de la méthode image_create ?


    Merci.
    Dernière modification par Invité ; 06/12/2020 à 17h47. Motif: Ajout du code

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par ceststef Voir le message
    Pensez-vous qu'il soit possible d'insérer un diagramme créé au moyen de MATPLOTLIB dans un widget TEXT sans que le texte qui le précède ne soit effacé ?
    Cà fait plusieurs questions:

    • Peut on insérer une image dans un texte affiché par le widget Text?
    • Est ce que je peux fabriquer une image à partir du diagramme affiché par matplotlib? Qui peut se reformuler en "faire une image de ce qui est affiché dans un Canvas?"


    La réponse est oui (c'est documenté et vous avez des exemples de code qui trainent sur Internet).

    - W

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui merci je suis en train de fouiner

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je ne parviens pas à comprendre: rien ne s'affiche.
    Ce qui est certain c'est que ce n'est pas la machine qui dysfonctionne mais le bonhomme.
    Qu'est ce que je n'ai pas su voir ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            matplotlib.use('Agg')
            plt.savefig("imageCreation.png",  bbox_inches='tight')
            img =PhotoImage(file ="imageCreation.png")
            self.text0.image_create(END, image=img)

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,

    Si vous ne postez pas un minimum de code qui permet de reproduire le problème constaté, on peut imaginer tous les soucis du débutants qui affiche des images avec un widget tkinter (et consulter la FAQ est une bonne idée pour en faire le tour).

    - W

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je ne vais peut être pas retranscrire ici tout le programme mais plutôt les éléments qui intéressent le widget text que j'utilise.
    J'ai volontairement créé une interface noire, dépouillée, je préfère.

    Je crée mon interface avec les widgets de cette façon:

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    class Win():
        """ CLASS qui crée la connexion base de données, les tables, la GUI """
     
     
     
    #1/ METHODES CRÉATION FENÊTRE INITIALE AVEC LES CADRES ET LES WIDGETS DE GUI
        ########################################################################
        def __init__(self): 
            # Création de la fenêtre noire principale
            self.root = Tk()    										
            self.root.config(bg='black', bd =3, pady=5, padx=5)        
            self.police= "{arial} 18 "
            self.police2= "{arial} 16 "
            w =1400
            h =950
            ws =self.root.winfo_screenwidth()
            hs =self.root.winfo_screenheight()
            x=(ws/2)
            x=x -(w/2)        
            y=(hs/2)
            y =y -(h/2)
            self.root.geometry('%dx%d+%d+%d' % (w, h, x, y))        
     
     
            # Création du cadre frame4  ( affichage des messages instructions)
            self.frame4 =Frame(self.root, bd=0, width=1300, height=75, pady=5, bg='black')
            self.frame4.pack(side=BOTTOM)
            self.frame4.pack_propagate(False)
     
     
            # Création du cadre frame3  BAS DROITE( affichage des entrées utilisateur )
            self.frame3=Frame (self.root, bd=0, width=800, height=75, pady=5, bg='black')
            self.frame3.pack (side =BOTTOM)
            self.frame3.pack_propagate(False)
     
     
            # Création du cadre frame2  DROITE ( affichage textes avancement )
            self.frame2 =Frame(self.root, bd=0, width=800, height=75, pady =5, bg='black')
            self.frame2.pack (side=BOTTOM)
            self.frame2.pack_propagate(False)
     
     
     		# Création du cadre frame1  HAUT GAUCHE ( affichage des LISTES )
            self.frame1 =Frame(self.root, bd=5, width=300, height=600, pady=5, padx=5, bg='black')
            self.frame1.pack (side=LEFT)
            self.frame1.pack_propagate(False)
     
     
    		# Création du cadre frame0   HAUT DROIT ( pour accueillir les TEXTES )
            self.frame0 =Frame(self.root, bd=5, width=1000, height=600, pady=5, padx=1, bg='black')
            self.frame0.pack (side=RIGHT)
            self.frame0.pack_propagate(False)
     
     
            # Création du widget  text0 dans frame0   HAUT DROIT ( nécessaire pour permettre l'affichage des textes dans ce cadre )
            self.text0 =Text(self.frame0, bd=0, bg='black', font=self.police2, fg="thistle4", width=100, height=2000, highlightbackground='black')
            self.text0.pack()
     
     
            # Création du widget  listbox1 dans frame1   HAUT GAUCHE ( nécessaire pour permettre l'affichage des listes dans ce cadre )
            self.listbox1 =Listbox (self.frame1, bd=1, bg="black", fg="thistle4", width =25, height=2000, highlightbackground='black', font=self.police2)
            self.listbox1.pack()
     
     
            # Création du widget  label2 dans frame2   CADRE DROITE SOUS LE CADRE DES TEXTES ( nécessaire pour permettre l'affichage dans ce cadre de labels d'instructions )
            self.texteLabel2 =StringVar()
            self.texteLabel2.set ("Bienvenue")
            self.label2= Label(self.frame2, width= 150, textvariable=self.texteLabel2, fg="thistle4", bg="black", font=self.police)
            self.label2.pack()
     
     
            # Création du widget  label4 dans frame4   CADRE EN BAS A DROITE (nécessaire pour permettre l'affichage dans ce cadre de labels d'état d'avancement )
            self.texteLabel4 =StringVar()
            self.texteLabel4.set ("En attente du choix dans le menu")
            self.label4= Label(self.frame4, width= 300, textvariable=self.texteLabel4, fg="thistle4", bg="black", font=self.police2, justify='left')
            self.label4.pack()
    Je me suis créé quelques méthodes pour pouvoir ajouter du texte dans le widget text que j'ai nommé "self.text0"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        def clearText0(self):
            """ Méthode qui efface le texte et le remet à jour dans la partie TEXT0 située dans le cadre en HAUT DROITE """
            self.text0.delete('1.0', END)
            self.text0.update()
     
        def changeText0(self, texte):
            """ Méthode qui attend du texte .
                Il sera inséré dans la partie TEXT0, en la remettant à jour, située dans le cadre en HAUT DROITE """
            self.text0.insert('end', texte)
            self.text0.update()
    Ensuite viens le moment de la visualisation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        def visualisation(self, feature, moyenne,mediane,quartile_1,quartile_2,quartile_3):
            plt.hist(feature)
            plt.title("Histogramme et moyenne")
            plt.axvline(moyenne, color='red', linestyle='dashed', linewidth=1,label = str(moyenne))
            plt.legend(loc='upper right')
     
     
            plt.savefig("imageCreation.png",  dpi=100, bbox_inches='tight')
            os.rename("imageCreation.png","imageCreation.gif")
            img =PhotoImage(file ="imageCreation.gif")
            self.text0.image_create('end', image=img)
    J'ai pu lire que seul le format gif convenait pour le widget text. Aussi une fois l'image créée par plt, je l'enregistre en .png (puisque c'est aussi semble-t-il une contrainte de savefig.)
    Je modifie donc le format de l'image et je finis par l'utilisation de la méthode image_create.

    Cela semble fonctionner car je retrouve dans mon widget text en sous-brillance le format de mon image mais elle est noire.
    Je pense que c'est probablement lié aux options choisies lors de la création de text0 car mon texte a un foreground quasi blanc.

    Même si l'image est probablement traitée comme un caractère, tkinter l'affiche pourtant en noir car je ne la devine que si je cherche à la sélectionner au moyen de la souris.

    Je pense qu'il me faut parvenir à contraindre text0 à faire que l'image insérée soit traitée avec ses couleurs d'origine.
    Qu'en pensez-vous ?

    Merci en tout cas.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Salut,


    Citation Envoyé par ceststef Voir le message
    Qu'en pensez-vous ?
    Je vous ai déjà suggéré de regarder la FAQ, on y trouve l'article "comment afficher une image..."

    Citation Envoyé par ceststef Voir le message
    Je ne vais peut être pas retranscrire ici tout le programme mais plutôt les éléments qui intéressent le widget text que j'utilise.
    L'interaction entre une image et widget Text est un détail technique qui se résume en quelques lignes (de code). Soit on essaie de travailler sur ce détails "avant", soit on le fait parce qu'on a un problème: ce caillou bloque votre "voyage" quelque soit la destination.

    - W

  8. #8
    Invité
    Invité(e)
    Par défaut
    Conformément à vos instructions, je me suis déjà penché sur la faq dont vous indiquez le lien.

    Si je comprends bien vos conseils, il me faut revenir la définition de self.text0 ?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 355
    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 355
    Points : 36 883
    Points
    36 883
    Par défaut
    Citation Envoyé par ceststef Voir le message
    Si je comprends bien vos conseils, il me faut revenir la définition de self.text0 ?
    C'est la FAQ qu'il faut essayer de comprendre: garder une référence à l'image!
    Ce qui peut se faire via:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            self.img = PhotoImage(file ="imageCreation.gif")
            self.text0.image_create('end', image=self.img)
    - W

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bon sang mais c'est bien sûr !

    Et tout devient lumineux.

    Pourquoi je n'ai pas percuté avant? Deux jours à me triturer les neurones. Pas assez manifestement.
    Que dire ? Je suis presque désolé ...
    Merci.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/04/2008, 17h30
  2. problème d'attribution d'un texte dans un widget text
    Par polo42 dans le forum Général Python
    Réponses: 5
    Dernier message: 11/07/2007, 08h34
  3. couleur du curseur dans un widget text Tk
    Par thieduvar dans le forum Tkinter
    Réponses: 1
    Dernier message: 08/07/2007, 22h39
  4. Prb affichage de "¬" dans un widget text
    Par Eileen dans le forum Tkinter
    Réponses: 2
    Dernier message: 03/06/2007, 07h14
  5. colorier une colonne dans un widget text
    Par Chris33 dans le forum Tkinter
    Réponses: 4
    Dernier message: 14/09/2006, 11h20

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