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
    Membre � l'essai
    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
    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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 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 : 21 770
    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 confirm�
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 095
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activit� : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 095
    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.

  4. #4
    Membre � l'essai
    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
    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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 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 : 21 770
    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
    Membre � l'essai
    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
    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
    Homme Profil pro
    Architecte technique retrait�
    Inscrit en
    Juin 2008
    Messages
    21 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 : 21 770
    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