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 :

affichage graphe matplotlib attend fermeture fenetre tkinter [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut affichage graphe matplotlib attend fermeture fenetre tkinter
    Bonsoir,

    Le gars sur

    réalise un code où il lance la visualisation d'un graphe matplotlib depuis une fenêtre tkinter.. et ça fonctionne.

    j'ai une code où la visualisation d'un graph matplotlib est également lancée depuis une fonction.
    Tant qu'il n'y avait pas de GUI tkinter ça fonctionnait et mon graphe apparaissait dans la fenêtre matplotlib.

    j'ai ajouté une GUI tk et maintenant la fenêtre du graphe s'ouvre mais reste noire et le graphe n’apparaît qu'au moment où je ferme la fenêtre tk.

    Y aurait-il un truc a savoir pour éviter ce conflit et retrouver un comportement aussi simple et naturel que celui sur la vidéo?

    PS: Voici un bout de code qui reproduit mon problème (du moins chez moi, sur un notebook jupyter).
    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    %matplotlib qt 
    # pour afficher la fenetre matplotlib depuis un notebook jupyter 
     
    from tkinter import *
    import numpy as np # faire des matrices utilisable pour les graphes
    import matplotlib.pyplot as plt # pour faire des graphes
    from mpl_toolkits.mplot3d import Axes3D # faire des graphes 3D
     
    def sampling_checks(x):
        global cpt, col_idx
        for i, param in enumerate(par_list):
            if v[x].get() == param and cpt < 3:
                col_idx[cpt] = i
                cpt += 1
                if cpt == 3:
                    sampling_3Dplot(col_idx[0], col_idx[1], col_idx[2], colList, par_list)
     
    def sampling_3Dplot(col0, col1, col2, columns, params):
        X = columns[col0] 
        Y = columns[col1] 
        Z = columns[col2]
        ax = plt.axes(projection='3d')
        ax.set_xlabel(params[col0])
        ax.set_ylabel(params[col1])
        ax.set_zlabel(params[col2])
        ax.scatter(X,Y,Z) 
        plt.show() 
     
     
    fen = Tk()
     
    par_list = ["temp", "time", "cata", "equiv"]
    colList = [[1,2,3,4,5,],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20]]
    cpt=0
    col_idx = [None, None, None]
    v = [None] * len(par_list)
    for i, param in enumerate(par_list):
        v[i] = StringVar()
        c0 = Checkbutton(fen, text=param, variable=v[i], onvalue=param, offvalue='', 
                         command=lambda x=i: sampling_checks(x))
        c0.grid(column=i, row=0, padx=2, pady=5) 
     
    fen.mainloop()

  2. #2
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut par ailleurs...
    j'ai testé le code de la vidéo (supposé fonctionner comme un charme).
    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
     
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    %matplotlib qt 
    # pour afficher la fenetre matplotlib depuis un notebook jupyter 
     
    from tkinter import *
    import numpy as np 
    import matplotlib.pyplot as plt 
    from PIL import ImageTk,Image 
     
    fen = Tk()
    def graph():
        house_prices = np.random.normal(200000, 25000, 5000)
        plt.hist(house_prices,50)
        plt.show()
     
    but = Button(fen, text="Graph it", command=graph) 
    but.grid(row=0, column=0)
     
    fen.mainloop()
    et j'ai le même problème (la fenêtre matplotlib apparaît noire et le graphe n'apparaît que quand je ferme la fenêtre tk)..

    du coup ma question revient à :
    Comment se fait il que ce qui fonctionne sur cette vidéo ne fonctionne pas chez moi?

    (Au cas ou cela aurait son importance: je suis sur ubuntu, editer jupyter notebook, python3 (via anaconda) ..
    d'autant plus que ce problème a déjà été remonté (et non résolu) https://www.developpez.net/forums/d1...-sous-tkinter/
    ça fonctionnait chez l'un pas chez l'autre.. ça marche chez vous?)

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Essaie cela plutôt :
    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
    import tkinter
     
    from matplotlib.backends.backend_tkagg import (
        FigureCanvasTkAgg, NavigationToolbar2Tk)
    # Implement the default Matplotlib key bindings.
    from matplotlib.backend_bases import key_press_handler
    from matplotlib.figure import Figure
     
    import numpy as np
     
     
    root = tkinter.Tk()
    root.wm_title("Embedding in Tk")
     
    fig = Figure(figsize=(5, 4), dpi=100)
    t = np.arange(0, 3, .01)
    fig.add_subplot(111).plot(t, 2 * np.sin(2 * np.pi * t))
     
    canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
     
    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
     
     
    def on_key_press(event):
        print("you pressed {}".format(event.key))
        key_press_handler(event, canvas, toolbar)
     
     
    canvas.mpl_connect("key_press_event", on_key_press)
     
     
    def _quit():
        root.quit()     # stops mainloop
        root.destroy()  # this is necessary on Windows to prevent
                        # Fatal Python Error: PyEval_RestoreThread: NULL tstate
     
     
    button = tkinter.Button(master=root, text="Quit", command=_quit)
    button.pack(side=tkinter.BOTTOM)
     
    tkinter.mainloop()

  4. #4
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut
    Hello, merci pour ce code.
    mais je ne sais pas m'en sortir pour adapter mon exemple sur la base de ce qui est proposé dans le tiens (je débute en python).

    Je viens de tester mon code sous Windows avec éditeur pyzo et ca fonctionne .
    Il semblerait que ce soit un problème de plateforme...

    Citation Envoyé par marco056 Voir le message
    j'ai essayé de changer les imports avec ceux de ton exemple et ça fait toujours le même comportement/problème..

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 609
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 609
    Points : 2 073
    Points
    2 073
    Par défaut
    Sans fonction :
    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
    import tkinter
     
    from matplotlib.backends.backend_tkagg import (
        FigureCanvasTkAgg, NavigationToolbar2Tk)
    from matplotlib.figure import Figure
     
    import numpy as np
     
    root = tkinter.Tk()
    root.wm_title("Embedding in Tk")
     
    fig = Figure(figsize=(5, 4), dpi=100)
    house_prices = np.random.normal(200000, 25000, 5000)
    fig.add_subplot(111).hist(house_prices,50)
     
    canvas = FigureCanvasTkAgg(fig, master=root)  # A tk.DrawingArea.
    canvas.draw()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
     
    toolbar = NavigationToolbar2Tk(canvas, root)
    toolbar.update()
    canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
     
    def _quit():
        root.quit()     # stops mainloop
        root.destroy() 
     
     
    button = tkinter.Button(master=root, text="Quit", command=_quit)
    button.pack(side=tkinter.BOTTOM)
     
    tkinter.mainloop()

  6. #6
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut
    merci marco mais..
    Désolé, j'avoue ne toujours pas savoir quoi faire de votre exemple.
    Comme déjà dit, j'ai essayé de placer les imports que vous proposez mais ça n'a pas fait fonctionner mon code.
    Du coup, je ne comprends pas, en lisant votre exemple, ce que je dois changer dans mon code pour qu'il fonctionne.

    Si quelqu'un a une solution (que je puisse comprendre et adapter à mon code i.e. celui que je donne en exemple au début),
    je reste preneur

    Merci pour toute aide


    PS: En définitive, au vue du nombre de fois ce post a été ouvert et du peu de réponse qu'il a reçu..
    je me dis qu'il sera peut être préférable d’éviter ubuntu et préférer windows pour coder, tester et utiliser du matplotlib+tkinter... .. non?

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

    Citation Envoyé par Jma06 Voir le message
    En définitive, au vue du nombre de fois ce post a été ouvert et du peu de réponse qu'il a reçu..
    je me dis qu'il sera peut être préférable d’éviter ubuntu et préférer windows pour coder, tester et utiliser du matplotlib+tkinter... .. non?
    La suggestion de marco056 est correcte: si vous voulez mélanger de graphes matplotlib avec tkinter, il faut faire comme matplotlib le propose (et pas en vous fiant à des videos qui utilisent des méthodes non documentées).

    Après le fait est que l'exemple de la vidéo ou la mouture plus orthodoxe proposée par marco056 ne fonctionnent pas sur votre environnement Ubuntu.

    Déjà assurez vous que vous avez les dernières versions de matplotlib et si le problème persiste, cherchez un peu sur Internet des idées auprès de ceux qui ont eu des problèmes similaires.

    note: c'est un problème spécifique à votre environnement! Pour y travailler, il faut se déplacer chez vous... ou le reproduire sur un environnement similaire (à construire).

    - W

  8. #8
    Membre régulier
    Homme Profil pro
    Amateur débutant
    Inscrit en
    Décembre 2019
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Amateur débutant

    Informations forums :
    Inscription : Décembre 2019
    Messages : 88
    Points : 104
    Points
    104
    Par défaut
    Merci W,

    Oui la solution de marco est correcte (d'ailleurs, pour la petite histoire, j'avais mis la main sur ce code, quelque part sur le web, lors de me recherches et y avait renoncé car trop complexe ... pour moi )
    Mais maintenant, grace a Marco, c'est un code que je vais garder dans mes notes pour faire afficher du matplotlib par tkinter...le jour ou je parts directement sur cette idée/structure.
    Pour cause, son dernier exemple, où il reprend le bout de code de codemy et l'adapte en faisant apparaître le graphe dans une fenêtre tk fonctionne très bien (sur Ubuntu donc).

    Désolé si je me suis mal exprimé, mon propos était que, vu mon niveau,
    je suis bien incapable d'adapter ce type de code, aussi orthodoxe soit il, a mon code de départ
    (ou j'affiche un graphe 3D à la sélection d'un troisième chekbutton)

    Cela dit, sachant que mon code va fonctionner sous Windows sans plus d'effort,
    que mon matplotlib est à jour et que mon problème est si spécifique que je n'ai réussi à trouver qu'un cas similaire non résolu (cf https://www.developpez.net/forums/d1...-sous-tkinter/ )..
    je crois que je vais devoir m'adapter et jongler entre ces deux OS

    Je ferme donc ce post et vous adresse tous mes remerciements Marco, W, pour votre temps et votre bienveillance.
    Bonne soirée

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

Discussions similaires

  1. [Python 3.X] Afficher une carte de chaleur matplotlib dans une fenetre tkinter
    Par thomas18F dans le forum Tkinter
    Réponses: 2
    Dernier message: 05/12/2020, 10h36
  2. Afficher un graphe matplotlib sur un tkinter
    Par elmhmdi dans le forum GUI
    Réponses: 1
    Dernier message: 11/06/2019, 08h10
  3. Interface tkinter fermeture fenetre
    Par julien300 dans le forum Général Python
    Réponses: 1
    Dernier message: 27/04/2018, 12h36
  4. Programme attend fermeture fenetre selection fichier
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/05/2009, 07h08
  5. Affichage graphe avec DBChart
    Par grominetos dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2004, 19h17

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