(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:
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