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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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 actif
    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
    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 Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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 actif
    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
    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 Expert
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 617
    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 actif
    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
    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?

+ 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