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 :

(Tkinter) Intégrer graphiques dans racine ? (Frames, classes, .. ?) [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut (Tkinter) Intégrer graphiques dans racine ? (Frames, classes, .. ?)
    Bonjour,

    Je suis actuellement sur un projet qui consiste à interpréter des signaux sous forme de graphiques avec tkinter, mais le problème c'est que les graphiques sont affichés chacune dans une fenêtre séparée. Or, je souhaite qu'ils soient tous intégrés dans l'interface que je souhaite créer, de manière à interagir plus facilement et d'un point de vue ergonomique.
    Alors, apparemment ce serait possible en utilisant des classes, mais aussi avec des frames.

    Donc, ma question est : Quelle est la meilleure solution ?

    J'ai déjà commencé à regarder les classes avec un peu de mal, mais au final j'obtiens ce code :

    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
     
    #!/usr/bin/python
    # -*- coding: iso-8859-1 -*-
     
    import tkinter as Tkinter
    import math
    import matplotlib
    import matplotlib.pyplot as plt
    import numpy as np
     
    matplotlib.use('TkAgg')
    from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
     
    class simpleapp_tk(Tkinter.Tk):
    	def __init__(self,parent):
    		Tkinter.Tk.__init__(self,parent)
    		self.parent = parent
    		self.initialize()
     
    	def initialize(self):
    		self.grid()
     
    		fig3 = plt.figure(3)
     
    		entry = Tkinter.Entry(self) # Pour placer sa nouvelle fréquence
     
    		canvas = FigureCanvasTkAgg(fig3, master=self)
    		plot_widget = canvas.get_tk_widget()
     
    		plt.ion()
    		t = np.arange(0, 100, 0.001) # entre 0 et 20 ms
    		frequence = 50 # 50 Hz par défaut
    		s = np.sin(2*np.pi*frequence*(t/1000)) # valeur de tensions par défaut pour 50 Hz
    		plt.plot(t, s) # tracé du signal
     
    		self.entry = Tkinter.Entry(self)
    		self.entry.grid(column=0,row=0,sticky='EW')
     
    		button = Tkinter.Button(self,text=u"Click me !")
    		button.grid(column=1,row=0)
     
    		label = Tkinter.Label(self,
    							  anchor="w",fg="white",bg="blue")
    		label.grid(column=0,row=1,columnspan=2,sticky='EW')
     
    		if entry.get():
    			plt.clf()
    			frequence = float(entry.get()) # Récupération de la fréquence
    			s = np.sin(2*np.pi*frequence*(t/1000)) # Recalcule de la tension instantanée pour chaque valeur de temps
    			plt.plot(t, s)
    			fig3.canvas.draw() # Mise à jour du tracé
     
    if __name__ == "__main__":
    	app = simpleapp_tk(None)
    	app.title('my application')
    	fig3 = plt.figure(3)
    	canvas = FigureCanvasTkAgg(fig3, master=self)
    	plot_widget = canvas.get_tk_widget()
    	plot_widget.grid(row=0, column=0)
    	champ_freq=Tkinter.Label(self,text="\nFrequence\n")
    	champ_freq.pack()
    	Tkinter.Button(self,text="Update",command=initialize).grid(row=1, column=0)
     
    	entry.grid(row=2, column=0)
     
    	app.mainloop()
    Pour l'instant, je n'ai essayé d'intégrer qu'un seul graphe, mais j'obtiens une erreur : " 'self' is not defined " .
    J'ai par ailleurs mis 2 fois les mêmes éléments à certains endroits car sinon j'avais d'autres erreurs de " not defined " ...

    Si quelqu'un avait une solution, j'apprécierais grandement. Merci

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

    Vous devriez jetez un oeil aux subplot de matplotlib.

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

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Intéressant et beaucoup plus simple, merci. En revanche, il resterait quand même 2 fenêtres au lieu d'une. Je n'ai jamais vu d'exemple de fenêtre graphique directement intégrée dans la racine.
    Serait-ce faisable ? Merci

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    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 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Citation Envoyé par Akeran Voir le message
    Intéressant et beaucoup plus simple, merci. En revanche, il resterait quand même 2 fenêtres au lieu d'une. Je n'ai jamais vu d'exemple de fenêtre graphique directement intégrée dans la racine.
    Je ne comprends pas trop ce que vous racontez. Avez vous regardé les embedding_in_tk* dans ces exemples?

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

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Ok d'accord, je n'avais pas regardé cette section (lool)

    Mais j'avoue me sentir un peu au fond là, je viens d'avoir les deux solutions que je cherche depuis la semaine dernière.

    Bon bah merci beaucoup !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 242
    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 242
    Points : 36 699
    Points
    36 699
    Par défaut
    Citation Envoyé par Akeran Voir le message
    Mais j'avoue me sentir un peu au fond là, je viens d'avoir les deux solutions que je cherche depuis la semaine dernière.
    Une bibliothèque comme matplotlib est assez riche en fonctionnalités et la documentation donne des tas d'exemples qu'on peut réutiliser facilement. Mais les débutants se laissent souvent avoir par leur clavier: c'est hyper-chronophage d'essayer de mettre au point un truc surtout quand on pense y être presque ...
    On oublie souvent qu'en développement, ce sont les derniers 5 à 10% du code qui bouffent 90 a 95% du temps.
    Essayez de lire la documentation complètement pour y prendre ses repères, voir ce qu'elle contient pour pouvoir y revenir plus tard, c'est moins ludique que de taper sur un clavier mais bien plus rentable côté temps.

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

  7. #7
    Membre habitué
    Avatar de Benbout
    Homme Profil pro
    Avide de savoir
    Inscrit en
    Avril 2016
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Avide de savoir

    Informations forums :
    Inscription : Avril 2016
    Messages : 62
    Points : 142
    Points
    142
    Billets dans le blog
    1
    Par défaut
    Si tu as une classe pour ton graphique par exemple (donc que tu considere que ton graphique est un objet composé de x éléments/autres objets), tu peux en créer autant que tu veux il suffit de l'instancier à partir d'un frame en précisant lors de son instanciation que ton objet (qui est bati sur un objet de type frame) appartient à la fenetre Toto dans laquelle tu souhaite que ce widget soit créé. Ensuite, tu peux automatiser ca pour que lorsqu'un graphique est créé il soit mis à tel endroit dans la fenetre principale etc etc.

    Tu as un probleme de self car t'utilises cette variable dans ton main() hors l'interpreteur ne comprend pas ce que tu lui demandes, lui il check dans cette callback et ne trouve aucune variable self déclarée, car dans une classe le mot self renvoie à l'identifiant de l'objet, mais dans un main ca renvoie à une variable déclarée qui devrait s'appeler self, ce qui n'est pas le cas dans ton code, d'ou l'erreur que l’interpréteur te communique.

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

Discussions similaires

  1. Intégrer un MainFrame dans un Frame
    Par fripette dans le forum Interfaces Graphiques en Java
    Réponses: 4
    Dernier message: 07/02/2008, 10h52
  2. Réponses: 10
    Dernier message: 15/05/2006, 11h57
  3. [Tkinter] Comment insérer une Frame dans une Frame ?
    Par THE_VIP dans le forum Tkinter
    Réponses: 2
    Dernier message: 30/04/2006, 23h15
  4. [Tkinter] image dans un Frame
    Par THE_VIP dans le forum Tkinter
    Réponses: 7
    Dernier message: 26/04/2006, 15h01
  5. [Tkinter] afficher un graphique dans un canevas
    Par Makino dans le forum Tkinter
    Réponses: 2
    Dernier message: 09/03/2006, 14h37

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