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 :

Plusieurs pages pour tracer un graph avec données utilisateur


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Plusieurs pages pour tracer un graph avec données utilisateur
    Bonjour !

    J'ai besoin de votre aide !

    Je souhaite créer une IHM permettant à un utilisateur d'entrée des données et de tracer automatiquement un graphique. Pour ce faire j'ai décidé d'utiliser Tkinter.

    Ce que je souhaite pour mon application c'est une page d'acceuil sur laquelle l'utilisateur entre ses données puis clique sur un bouton pour tracer un graph sur une seconde page.

    Mon idée finale est de récupérer des données via APIs grâce aux entrées de l'utilisateur, et d'exploiter ces données pour tracer un graph.

    Mais avant d'en arrivée là, je bloque sur certains points au niveau de tkinter que je maîtrise encore mal.

    J'ai donc suivis la première partie d'un tutoriel : https://pythonprogramming.net/tkinte...ctual-program/ ; qui m'a permit de créer les deux fenêtres dont j'ai besoin.

    J'ai alors tenté avec un exemple simple de tracer un graphique en utilisant le widget Entry pour récupérer les infos de l'utilisateur :

    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
     
    import matplotlib
    matplotlib.use("TkAgg")
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
    from matplotlib import style
     
    import tkinter as tk
    from tkinter import ttk
     
     
    LARGE_FONT= ("Verdana", 16)
    NORM_FONT = ("Helvetica", 10)
    SMALL_FONT = ("Helvetica", 8)
     
    style.use("ggplot")
     
    f = Figure()
    a = f.add_subplot(111)
     
    # ---------- Fonction pour tracer le graph sur la "Page du graph"
     
    def Graph():
     
        x1 = float(entry1.get())
        x2 = float(entry2.get())
        x3 = float(entry3.get())
     
     
        xAxis = [float(x1),float(x2),float(x3)]
        yAxis = [float(x1),float(x2),float(x3)]
        a.bar(xAxis,yAxis)
     
     
     
    class GUI(tk.Tk):
     
        def __init__(self, *args, **kwargs):
     
            tk.Tk.__init__(self, *args, **kwargs)
     
            tk.Tk.wm_title(self, "Titre")
     
            container = tk.Frame(self)
            container.pack(side="top", fill="both", expand = True)
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight=1)
     
            #Menu
            menubar = tk.Menu(container)
            filemenu = tk.Menu(menubar, tearoff=0)
            filemenu.add_command(label="Exit", command=self.destroy)
            menubar.add_cascade(label="File", menu=filemenu)
     
            tk.Tk.config(self, menu=menubar)
     
            self.frames = {}
     
            for F in (StartPage, PageGraph):
                frame = F(container, self)
                self.frames[F] = frame
                frame.grid(row=0, column=0, sticky="nsew")
            self.show_frame(StartPage)
     
        def show_frame(self, cont):
     
            frame = self.frames[cont]
            frame.tkraise()
     
     
    class StartPage(tk.Frame):
     
        def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self, text="Page d'acceuil", font=LARGE_FONT)
            label.pack(pady=10,padx=10)
     
            #---------- Boutton pour switcher sur la "Page du graph"
     
            button = ttk.Button(self, text="Page du Graph",
                                command=lambda: controller.show_frame(PageGraph))
            button.pack()
     
            label1 = ttk.Label(self, text="X1", font=NORM_FONT)
            label1.pack(pady=10,padx=10)
            entry1 = ttk.Entry(self)
            entry1.pack(pady=10,padx=10)
     
            label2 = ttk.Label(self, text="X2", font=NORM_FONT)
            label2.pack(pady=10,padx=10)
            entry2 = ttk.Entry(self)
            entry2.pack(pady=10,padx=10)
     
            label3 = ttk.Label(self, text="X3", font=NORM_FONT)
            label3.pack(pady=10,padx=10)
            entry3 = ttk.Entry(self)
            entry3.pack(pady=10,padx=10)
     
            # ---------- Boutton pour tracer le graph dans "Page du graph"
     
            button1 = ttk.Button(self, text="Valider", command=Graph)
            button1.pack()
     
     
     
     
     
    class PageGraph(tk.Frame):
     
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label = tk.Label(self, text="Graph Page", font=LARGE_FONT)
            label.pack(pady=10,padx=10)
     
            # ---------- Boutton pour retourner à la page d'acceuil
     
            button1 = ttk.Button(self, text="Back to Home",
                                command=lambda: controller.show_frame(StartPage))
            button1.pack()
     
            # ---------- Création du canvas
     
            canvas = FigureCanvasTkAgg(f, self)
            canvas.draw()
            canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
     
            toolbar = NavigationToolbar2TkAgg(canvas, self)
            toolbar.update()
            canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
     
     
     
     
    app = GUI()
    app.geometry("1280x720")
    app.mainloop()
    Et bien évidemment rien ne se trace ! ^^'

    Je pense que mon problème vient de l'utilisation des classes qui ne me sont pas encore très familières je doit l'avouer !

    Auriez-vous une idée de l'origine de mon problème ?

    Je vous remercie !

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Sans passer par les classes, je parviens à tracer un graph dans la page sur laquelle l'utilisateur entre ses données :

    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
     
    root= tk.Tk()
     
     
    def Graph():
     
        x1 = float(entry1.get()) 
        x2 = float(entry2.get()) 
        x3 = float(entry3.get()) 
     
     
        xAxis = [float(x1),float(x2),float(x3)] 
        yAxis = [float(x1),float(x2),float(x3)] 
     
        figure1 = Figure(figsize=(5,4), dpi=100) 
        a = figure1.add_subplot(111)
     
        a.bar(xAxis,yAxis) 
     
        canvas = FigureCanvasTkAgg(figure1, root) 
        canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True)
     
     
     
     
     
     
    label1 = ttk.Label(root, text="x1")
    label1.pack(pady=10,padx=10)
    entry1 = ttk.Entry (root)
    entry1.pack()
     
    label2 = ttk.Label(root, text="x2")
    label2.pack(pady=10,padx=10)       
    entry2 = ttk.Entry (root)
    entry2.pack()
     
    label3 = ttk.Label(root, text="x3")
    label3.pack(pady=10,padx=10)
    entry3 = ttk.Entry (root)
    entry3.pack()  
     
     
     
    button2 = ttk.Button (root, text='Tracer le graph ',command=Graph) 
    button2.pack(pady=10,padx=10) 
     
    button1 = ttk.Button (root, text='Quitter', command=root.destroy)
    button1.pack(pady=10,padx=10)  
     
     
    root.mainloop()
    Mais je ne parviens pas à adapter cela au code qui permet de jongler entre les deux fenêtres !

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

    Citation Envoyé par Bendiev Voir le message
    Auriez-vous une idée de l'origine de mon problème ?
    Je ne vois pas comment le code que vous avez posté ne planterait pas dès la ligne 11 et un message d'erreur Python qui devrait vous être familier.

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

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Oups autant pour moi, j'ai mal copié/collé mes importations ! Je viens d'éditer mon message initial ! Merci.

    Vous devriez pouvoir faire tourner mon code maintenant !

    Comme je le disais mon problème s'articule autour des widgets Entry et des entry123.get() de ma fonction Graph(), qui ne captent jamais les inputs de l'utilisateur !

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

    Citation Envoyé par Bendiev Voir le message
    Comme je le disais mon problème s'articule autour des widgets Entry et des entry123.get() de ma fonction Graph(), qui ne captent jamais les inputs de l'utilisateur !
    Dans le code qui fonctionne les variables entry123 sont globales (et donc accessibles en lecture à la fonction Graph).
    Et lorsque ces variables là sont définies à l'intérieur d'une fonction, elles sont locales et "Graph" ne peut plus les voir.

    Vous pourriez en faire des "attributs" d'instance (self.entry123) et faire de Graph une méthode (par exemple).

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

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Merci, je comprend mieux !

    J'ai donc intégré la fonction Graph à la classe StartPage :

    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
     
    import matplotlib
    matplotlib.use("TkAgg")
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
    from matplotlib.figure import Figure
    from matplotlib import style
     
    import tkinter as tk
    from tkinter import ttk
     
     
    LARGE_FONT= ("Verdana", 16)
    NORM_FONT = ("Helvetica", 10)
    SMALL_FONT = ("Helvetica", 8)
    style.use("ggplot")
     
     
    #f = Figure()
    #a = f.add_subplot(111)
     
    # ---------- Fonction pour tracer le graph sur la "Page du graph"
     
    class GUI(tk.Tk):
     
        def __init__(self, *args, **kwargs):
     
     
            tk.Tk.__init__(self, *args, **kwargs)
     
            tk.Tk.wm_title(self, "Titre")
     
            container = tk.Frame(self)
            container.pack(side="top", fill="both", expand = True)
            container.grid_rowconfigure(0, weight=1)
            container.grid_columnconfigure(0, weight=1)
     
            #Menu
            menubar = tk.Menu(container)
            filemenu = tk.Menu(menubar, tearoff=0)
            filemenu.add_command(label="Exit", command=self.destroy)
            menubar.add_cascade(label="File", menu=filemenu)
     
            tk.Tk.config(self, menu=menubar)
     
            self.frames = {}
     
            for F in (StartPage, PageGraph):
                frame = F(container, self)
                self.frames[F] = frame
                frame.grid(row=0, column=0, sticky="nsew")
            self.show_frame(StartPage)
     
        def show_frame(self, cont):
     
            frame = self.frames[cont]
            frame.tkraise()
     
     
     
    class StartPage(tk.Frame):
     
        def __init__(self, parent, controller):
            tk.Frame.__init__(self,parent)
            label = tk.Label(self, text="Page d'acceuil", font=LARGE_FONT)
            label.pack(pady=10,padx=10)
     
            #---------- Boutton pour switcher sur la "Page du graph"
     
            button = ttk.Button(self, text="Page du Graph",
                                command=lambda: controller.show_frame(PageGraph))
            button.pack()
     
            label1 = ttk.Label(self, text="X1", font=NORM_FONT)
            label1.pack(pady=10,padx=10)
            self.entry1 = ttk.Entry(self)
            self.entry1.pack(pady=10,padx=10)
     
            label2 = ttk.Label(self, text="X2", font=NORM_FONT)
            label2.pack(pady=10,padx=10)
            self.entry2 = ttk.Entry(self)
            self.entry2.pack(pady=10,padx=10)
     
            label3 = ttk.Label(self, text="X3", font=NORM_FONT)
            label3.pack(pady=10,padx=10)
            self.entry3 = ttk.Entry(self)
            self.entry3.pack(pady=10,padx=10)
     
            # ---------- Boutton pour tracer le graph dans "Page du graph"
     
            button1 = ttk.Button(self, text="Valider", 
                                 command=self.Graph)
            button1.pack()
     
     
        def Graph(self):
     
            x1 = (self.entry1.get())
            x2 = (self.entry2.get())
            x3 = (self.entry3.get())
     
            f = Figure()
            a = f.add_subplot(111)     
     
            xAxis = [float(x1),float(x2),float(x3)]
            yAxis = [float(x1),float(x2),float(x3)]
            a.bar(xAxis,yAxis)
     
     
     
     
     
    class PageGraph(tk.Frame):
     
        def __init__(self, parent, controller):
            tk.Frame.__init__(self, parent)
            label = tk.Label(self, text="Graph Page", font=LARGE_FONT)
            label.pack(pady=10,padx=10)
     
            # ---------- Boutton pour retourner à la page d'acceuil
     
            button1 = ttk.Button(self, text="Back to Home",
                                command=lambda: controller.show_frame(StartPage))
            button1.pack()
     
            # ---------- Création du canvas
     
            canvas = FigureCanvasTkAgg(f, self)
            canvas.draw()
            canvas.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
     
            toolbar = NavigationToolbar2TkAgg(canvas, self)
            toolbar.update()
            canvas._tkcanvas.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
     
     
     
     
    app = GUI()
    app.geometry("1280x720")
    app.mainloop()
    Je ne sais pas si c'est bien réalisé, mais self.entry123.get() n'est plus source de message d'erreur !
    Le tracé ne se réalise cependant toujours pas.

    J’imagine donc cette fois qu'un problème similaire apparaît entre Graph() de la classe StartPage et le canvas qui lui est dans la classe PageGraph ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 285
    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 285
    Points : 36 773
    Points
    36 773
    Par défaut
    Citation Envoyé par Bendiev Voir le message
    J’imagine donc cette fois qu'un problème similaire apparaît entre Graph() de la classe StartPage et le canvas qui lui est dans la classe PageGraph ?
    oui et non...
    Là vous avez un soucis de "cohérence".
    StartPage saisit les entrées, PageGraph affiche le plot matplotlib et donc la question est "je fais quoi où" et si je fais çà là que passer de l'un à l'autre.

    En plus vous avez récupéré un code qui fait un truc plutôt "générique" et qui vous contraint à... alors que si vous preniez le temps de réfléchir un peu à comment réaliser cela,
    vous auriez juste besoin d'une seule classe (ce qui serait plus simple).

    Dit autrement, vous avez tout ce qu'il faut pour faire fonctionner votre truc mais la structure qu'on vous impose est un peu trop indigeste...: simplifiez!


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

Discussions similaires

  1. Réponses: 0
    Dernier message: 11/08/2009, 16h21
  2. Réponses: 15
    Dernier message: 04/07/2007, 12h04
  3. probleme pour tracer une ligne avec OleExcel
    Par blondelle dans le forum C++Builder
    Réponses: 6
    Dernier message: 18/08/2006, 19h10
  4. tracer des graphes avec php
    Par estampille dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2006, 18h28
  5. plusieurs pages pour gros fichiers (processeur js)
    Par arnobidul dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 25/07/2005, 09h22

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