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 :

Probleme d'affichage avec Tkinter et matplotlib [Python 3.X]


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2022
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Probleme d'affichage avec Tkinter et matplotlib
    Bonjour a tous,

    J'ai un problème avec mon code, Le début du programme fonctionne normalement: Le tableau s'ouvre, on peut y entre les valeur et appuyez sur le bouton "calcul" mais la une fenêtre de matplotlib s'ouvre pour afficher les vecteur et réduit le tableau d'entre... J'aimerais qu'il garde la même taille.

    Si qq peut m'aider merci beaucoup!
    Désolé pour le code "spaghetti"

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    from tkinter import Tk, Entry, Button, Frame, Label, mainloop
    import matplotlib.pyplot as plt
    root = Tk()
    x = []
    z = []
    t = []
    erreur = "La valeur entre n'est pas valide veuillez réessayer"
    nbdone = 3 #Fnbdonne()
    deltaT = 5 #FdeltaT()
    nomX = "X"#input("Quelle est le titre des abscisse?")
    nomZ = "Z"#input("Quelle est le titre des ordonnés?")
    Tconstr = 0
    loop = 1
    doneconstr = []
    ligneTitre = []
    entryListe = []
    colonneTitre = [nomX, nomZ]
     
    for i in range(nbdone):
        doneconstr = ["Donnée " + str(i+1)]
        ligneTitre = ligneTitre + doneconstr
        Tconstr += deltaT
        t.append(Tconstr)
    for i in range(len(t)):
        t[i]=float(t[i])
     
    width = len(ligneTitre) + 1
    height = len(colonneTitre) + 1
     
    #Les fonctions------------------------------------------------------
    def getData():
        global loop
        global entryListe
        print("getData")
        x[:] = []
        z[:] = []
        entry_value = []
        for i in range(height - 1):
            for j in range(width - 1):
                if i == 0:
                    x.append(entryListe[i][j].get())
                if i == 1:
                    z.append(entryListe[i][j].get())
     
        for i in range(len(x)):
            try:
                x[i] = int(x[i])
            except ValueError:
                tableau()
            try:
                z[i] = int(z[i])
            except ValueError:
                tableau()
        loop = 0
        v_x,v_y,temps_v=calcul_vitesses(z,x,t)
        representation_vecteur_vitesse(z,x,v_x,v_y)
        plt.show()
     
    def effacer():
        """Efface toutes les données du tableau"""
        for i in range(height - 1):
            for j in range(width - 1):
                entryListe[i][j].delete(0, "end")
     
    def calcul_vitesses(abscisses,ordonnees,temps):
        v_x=[]
        v_y=[]
        for n in range(len(abscisses)-1):
            v_x.append((abscisses[n+1]-abscisses[n])/(temps[n+1]-temps[n]))
            v_y.append((ordonnees[n+1]-ordonnees[n])/(temps[n+1]-temps[n]))
        temps=temps[:-1]
        return v_x,v_y,temps
     
    def representation_vecteur_vitesse(abscisses,ordonnees,v_x,v_y):
        for i in range(len(v_x)):
            plt.quiver(abscisses[i], ordonnees[i] ,v_x[i] , v_y[i], scale_units='xy',angles='xy', scale=0.3 , headwidth=3 , headlength=4)
        Tracer_des_positions(abscisses,ordonnees)
     
    def Tracer_des_positions(abscisses,ordonnees):
        plt.scatter(abscisses,ordonnees,marker='+', color='b')
        plt.title('Veuillez entre les donnée')
        plt.xlabel(nomX)
        plt.ylabel(nomZ)
        plt.xlim(0.6*min(abscisses),1.4*max(abscisses))
     
    def Fnbdonne():
        x = 0
        while True:
            try:
                x = int(input("Combien avait vous de donnez?"))
                if x > 1 :
                    break
                else:
                    print(erreur)
            except ValueError:
                print(erreur)
        return x
     
    def FdeltaT():
        x = 0
        while 1:
            try:
                x = float(input("Quelle est le delta T(en seconde)?"))
                if x > 0 :
                    break
                else:
                    print(erreur)
            except ValueError:
                print(erreur)
        return x
     
    def tableau():
        entryListe.clear
        print("Tableau")
        global root
        global loop
        root.title("Tableau de données")
     
        root.geometry("1000x150+150+200")
        frametab = Frame(root, relief = 'groove', borderwidth = 2, padx = 15,
                         pady = 15)
        frametab.grid(row = 0)
        framebouton = Frame(root, relief = 'groove', borderwidth = 2, padx = 15,
                         pady = 15)
        framebouton.grid(row = 1)
        # Production de la première ligne
        for i in range(width):
            if i == 0:
                b = Label(frametab, justify = "center", bg = "#ffffff", width = 12,
                          text = "", relief = "flat")
                b.grid(row = 0, column = i)
            else:
                b = Label(frametab, justify = "center", bg = "#BDEBF1", width = 12,
                          text = ligneTitre[i - 1], relief = "groove")
                b.grid(row = 0, column = i)
        # Production de la première colonne
        for i in range(height - 1):
            b = Label(frametab, justify = "center", bg = "#BDEBF1", width = 12,
                      text = colonneTitre[i], relief = "groove")
            b.grid(row = i + 1, column = 0)
     
        for i in range(height - 1):
            entryListe.append([])
            for j in range(width - 1):
                b = Entry(frametab, justify = "left", bg = "#ffffff", width = 14)
                entryListe[i].append(b)
                b.grid(row = i + 1, column = j + 1)
                b.insert(i, 0)
                entry_value = entryListe[i][j].get()
        boutonCalcul = Button (framebouton, text = "Calcul",
                        command = getData, fg = "red", font = ('Arial', 9))
        boutonCalcul.grid(row = 20, column = 1)
        boutonCalcul.config(width = 10)
     
        boutonEffacer = Button (framebouton, text = "Effacer",
                        command = effacer, fg = "red", font = ('Arial', 9))
        boutonEffacer.grid(row = 20, column = 2)
        boutonEffacer.config(width = 10)
     
        boutonFermer = Button (framebouton, text = "Fermer",
                        command = root.destroy, fg = "red", font = ('Arial', 9))
        boutonFermer.grid(row = 20, column = 4)
        boutonFermer.config(width = 10)
        if loop == 1:
            print("mainloop IN")
            root.mainloop()
            print("mainloop OUT")
     
    tableau()

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 770
    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 : 20 770
    Points : 35 851
    Points
    35 851
    Par défaut
    Salut,

    Pour utiliser tkinter de façon partagée avec matplotlib, il va falloir donner à matplotlib l'objet graphique (un Canvas) qu'il pourra utiliser.
    Il y a des exemples dans la gallery (matplotlib) et de nombreux articles qui racontent comment faire. A vous de regarder comment ça se construit plutôt que de partir à coder un truc qui est simple quand on a pris le temps de se documenter un peu.

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

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 424
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 424
    Points : 6 249
    Points
    6 249
    Par défaut
    Hello,

    Désolé pour le code "spaghetti"
    C'est pire si tu le sais... Pourquoi ne pas faire bien tout de suite ?

    Qu'est censé faire ce programme ?

    Si j'avais un conseil à donner, Tkinter devrait être utilisé une fois seulement avoir terminé le cœur de l'exercice.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2022
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour vos retour, le code est sensé demander des donnée que l'utilisateur fourni dans un tableau puis afficher des vecteur mais je veux que le tableau garde la même taille.

    Je vais refaire mon code pour qu'il soit plus clair et mieux construit. Je vais aussi chercher a propos des Canvas. Je vous tiens au courant.

    [EDIT]Apres avoir regarde, je ne veux pas utiliser de Canvas car j'ai besoin que le graphique soit facilement enregistrable, la fenêtre mathplotlib a déjà une fonction qui fait cela.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 770
    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 : 20 770
    Points : 35 851
    Points
    35 851
    Par défaut
    Citation Envoyé par Lufox Voir le message
    [EDIT]Apres avoir regarde, je ne veux pas utiliser de Canvas car j'ai besoin que le graphique soit facilement enregistrable, la fenêtre mathplotlib a déjà une fonction qui fait cela.
    Si vous ne voulez pas utiliser l'interface proposée pour interagir avec tkinter, on ne va pas en inventer une juste pour vous(*).
    Et les fonctionnalités existantes ne vont pas disparaître: il faut juste apprendre à utiliser cette interface
    (*) Vous pourriez jouer avec les widgets matploblib (sans toucher à tkinter directement).


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

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2022
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2022
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Apres avoir revu mon code, je pense qu'il sera plus lisible et plus structurer. Mais voila que j'ai un nouveau problème que je n'avait jamais vue avant...


    line 64, in tableau

    return self.tk.call(self._w, 'get')
    _tkinter.TclError: invalid command name ".!frame.!entry"


    Merci de m'expliquer car j'ai eu beau chercher je trouve sa nulle part...

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    import matplotlib.pyplot as plt
    from tkinter import *
    #Les fonctions------------------------------------------------------------------
    def vecteur(abscisses,ordonnees,temps):
        v_x=[]
        v_y=[]
        for n in range(len(abscisses)-1):
            v_xappend((abscisses[n+1]-abscisses[n])/(temps[n+1]-temps[n]))
            v_y.append((ordonnees[n+1]-ordonnees[n])/(temps[n+1]-temps[n]))
        temps=temps[:-.1]
        for i in range(len(v_x)):
            plt.quiver(abscisses[i], ordonnees[i] ,v_x[i] , v_y[i], scale_units='xy',angles='xy', scale=0.3 , headwidth=2 , headlength=4)
        plt.scatter(abscisses,ordonnees,marker='+', color='b')
        plt.title('saut en parachute')
        plt.xlabel('x en (dam)')
        plt.ylabel('Altitude z en (dam)')
        plt.xlim(0.8*min(abscisses),1.2*max(abscisses))
        plt.ylim(0.8*min(ordonnees),1.2*max(ordonnees))
     
    def tableau():
        global entryListe; global main
        #main.destroy()
        root = Tk()
        root.title("Tableau de données")
        root.iconbitmap("astronomy.ico")
        root.config(background = '#78DBE8')
        root.geometry("500x200+150+200")
     
        frametab = Frame(root, bg = '#78DBE8', relief = 'groove', borderwidth = 2, padx = 15, pady = 15)
        frametab.grid(row = 1, sticky = S)
        framebouton = Frame(root, bg ='#78DBE8', relief = 'groove', borderwidth = 2, padx = 15, pady = 15)
        framebouton.grid(row = 2)
        # Production de la première ligne
        for i in range(width):
            if i == 0:
                b = Label(frametab, bg = '#78DBE8', justify = "center", width = 12, relief = "flat")
                b.grid(row = 0, column = i)
            else:
                b = Label(frametab, justify = "center", bg = '#0f056b', fg = 'white', width = 12, text = colonneTitre[i - 1], relief = "groove")
                b.grid(row = 0, column = i)
        # Production de la première colonne
        for i in range(height - 1):
            b = Label(frametab, justify = "center", bg = '#0f056b', fg = 'white', width = 12, text = ligneTitre[i], relief = "groove")
            b.grid(row = i + 1, column = 0)
        entryListe.append([])
        for i in range(height - 1):
            entryListe.append([])
            for j in range(width - 1):
                b = Entry(frametab, justify = "left", bg = "#ffffff", width = 14)
                entryListe[i].append(b)
                b.grid(row = i + 1, column = j + 1)
                b.insert(i, 0)
                print("ok")
        bouton_ok = Button(framebouton,command = root.destroy, relief = 'flat', text = "OK", padx = 20, bg = '#0f056b', fg = 'white')
        bouton_ok.grid()
        root.mainloop()
        #---------------------------------------------------------------------------
        print("getData")
        x[:] = []
        z[:] = []
        for i in range(height - 1):
            for j in range(width - 1):
                if i == 0:
                    print("x=", entryListe[i][j].get())
                    #x.append(entryListe[i][j].get())
                if i == 1:
                    print("z=", entryListe[i][j].get())
                    #z.append(entryListe[i][j].get())
        for i in range(len(x)):
            try:
                x[i] = int(x[i])
            except ValueError:
                tableau()
            try:
                z[i] = int(z[i])
            except ValueError:
                tableau()
        loop = 0
        v_x,v_y,temps_v=calcul_vitesses(z,x,t)
        representation_vecteur_vitesse(z,x,v_x,v_y)
        plt.show()
     
    def fmain():
        global main; global nbdonne; global deltaT
        main = Tk()
        main.geometry("700x300")
        main.title("Vecteurs")
        main.iconbitmap("astronomy.ico")
        main.config(background = '#78DBE8')
     
        titre = Label(main, bg = '#78DBE8')
        titre.grid(row = 0, column = 0, padx = 60)
        #A--------------------------------------------------------------------------
        varA = StringVar()
        texteA = Label(main, bg = '#0f056b', fg = 'white', text = "Nombre de donnee :", font = 'Calibri')
        texteA.grid(row = 1, column = 1, padx = 20, pady = 10, ipadx = 40)
        entryA = Entry(main, textvariable = varA, bg = '#ffffff', width = 25)
        entryA.grid(row = 1, column = 2, padx = 10)
        #B--------------------------------------------------------------------------
        varB = StringVar()
        texteB = Label(main, bg = '#0f056b', fg = 'white', text = "Le \u0394t (en seconde) :", font = 'Calibri')
        texteB.grid(row = 2, column = 1, padx = 10, pady = 10, ipadx = 40)
        entryB = Entry(main, textvariable = varB, bg = '#ffffff', width = 25)
        entryB.grid(row = 2, column = 2, padx = 10)
        #C--------------------------------------------------------------------------
        varC = StringVar()
        texteC = Label(main, bg = '#0f056b', fg = 'white',  text = "Titre des abscisses :", font = 'Calibri')
        texteC.grid(row = 3, column = 1, padx = 10, pady = 10, ipadx = 40)
        entryC = Entry(main, textvariable = varC, bg = '#ffffff', width = 25)
        entryC.grid(row = 3, column = 2, padx = 10)
        #D--------------------------------------------------------------------------
        varD = StringVar()
        texteD = Label(main, bg = '#0f056b', fg = 'white',  text = "Titre des ordonnes :",  font = 'Calibri')
        texteD.grid(row = 4, column = 1, padx = 10, pady = 10, ipadx = 40)
        entryD = Entry(main, textvariable = varD, bg = '#ffffff', width = 25)
        entryD.grid(row = 4, column = 2, padx = 10)
        #Button---------------------------------------------------------------------
        Bouton_Valid = Button(main, bg = '#0f056b',fg = 'white', text = "Valider", font = 'Calibri', width = 15, command = main.destroy)
        Bouton_Valid.grid(row = 5, column = 2, padx = 10, pady = 20)
     
        main.mainloop()
        nbdonne = varA.get()
        deltaT = varB.get()
        nomX = varC.get()
        nomY = varD.get()
     
        nbdonne = int(nbdonne)
        deltaT = float(deltaT)
     
        ligneTitre.append(nomX)
        ligneTitre.append(nomY)
     
        for i in range(nbdonne):
            donneconstr = ["Donnée " + str(i+1)]
            colonneTitre.append(donneconstr)
     
        print(ligneTitre, colonneTitre)
     
        width = len(colonneTitre) + 1
        height = len(ligneTitre) + 1
     
        print(width, height)
     
        tableau()
    #Le programme principal---------------------------------------------------------
    x=[]
    z=[]
    t=[0]
    ligneTitre = ["X","Z"]
    colonneTitre = ["1", "2", "3"]
    entryListe = []
     
    deltaT = 5
    nbdonne = 10
    nomX = ""
    nomY = ""
     
    width = len(colonneTitre) + 1
    height = len(ligneTitre) + 1
     
    for i in range(nbdonne):
        t.append(t[i]+deltaT)
     
    #fmain()
    tableau()
    #vecteur(x,z,t)
    plt.show()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    20 770
    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 : 20 770
    Points : 35 851
    Points
    35 851
    Par défaut
    Salut,

    Probable que le widget ait été détruit (comment sort-on de mainloop?):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> import tkinter as tk
    >>> root = tk.Tk()
    >>> label = tk.Label()
    >>> root.destroy()
    >>> label['text']
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\py_env\py_3.11\Lib\tkinter\__init__.py", line 1708, in cget
        return self.tk.call(self._w, 'cget', '-' + key)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    _tkinter.TclError: invalid command name ".!label"
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

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

Discussions similaires

  1. Probleme d'affichage avec un DataGridView
    Par kekesilo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/01/2007, 14h12
  2. Probleme d'affichage avec TextOutA
    Par NouRSS dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2006, 15h01
  3. [Graphic2D] Probleme d'affichage avec drawLine()
    Par Yannick_from_31 dans le forum 2D
    Réponses: 12
    Dernier message: 23/05/2006, 18h09
  4. Problème d'affichage avec top
    Par HacHHacH dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 03/04/2006, 01h25
  5. Réponses: 6
    Dernier message: 10/11/2005, 08h58

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