J'ai un programme qui traite les données puis trace le résultat. Habituellement dans Python les tracés sont affichés dans une nouvelle fenêtre, mais je veux afficher le tracé dans la même fenêtre Tkinter. J'ai cherché et trouvé ces deux réponses, Python Tkinter Embed Matplotlib dans l'interface graphique , et Comment puis-je actualiser un tracé matplotlib dans une fenêtre Tkinter? . Ils indiquent que nous devons d'abord créer un canevas, puis le placer sur la fenêtre en utilisant une grille ou un pack. Ceci est la première fois que j'utilise canvas, j'ai appliqué le concept, et voici un exemple de code de travail pour cela,
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
__author__ = 'Dania'
import numpy as np
from Tkinter import *
import matplotlib.pyplot as plt
class mclass:
def __init__(self, window):
self.box = Entry(window)
self.button = Button (window, text="check", command=self.plot)
self.box.pack ()
self.button.pack()
def plot (self):
x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
p= np.array ([16.23697, 17.31653, 17.22094, 17.68631, 17.73641 , 18.6368,
19.32125, 19.31756 , 21.20247 , 22.41444 , 22.11718 , 22.12453])
plt.scatter(v,x,color='red')
plt.plot(p, range(2 +max(x)),color='blue')
plt.gca().invert_yaxis()
plt.suptitle ("Estimation Grid", fontsize=16)
plt.ylabel("Y", fontsize=14)
plt.xlabel("X", fontsize=14)
plt.show()
plt.gcf().canvas.draw()
fig = plt.figure()
canvas = FigureCanvasTkAgg(fig, master=window)
canvas.get_tk_widget().grid(row=1,column=24)
canvas.draw()
window= Tk()
start= mclass (window)
window.mainloop()
Le code ci-dessus montre d'abord le tracé dans une fenêtre séparée, puis affiche un canevas gris sans tracé à la position spécifiée dans la grille. De plus, le canevas se développe verticalement et une partie de la fenêtre disparaît, en d'autres termes le canevas pousse le contenu en dessous, et ils n'apparaissent plus car aucune barre de défilement verticale n'apparaît.
Je veux afficher l'intrigue dans la même fenêtre Tkinter, et si un contenu est poussé vers le bas, je veux pouvoir faire défiler la fenêtre.
EDIT: Un exemple de code de travail a été ajouté à la question.
Quelqu'un peut-il me dire quelle erreur j'ai commise et comment résoudre le problème?
Toute aide est appréciée.
Merci.
Principaux changements:
Résultat:
__author__ = 'Dania'
import matplotlib
matplotlib.use('TkAgg')
import numpy as np
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from Tkinter import *
class mclass:
def __init__(self, window):
self.window = window
self.box = Entry(window)
self.button = Button (window, text="check", command=self.plot)
self.box.pack ()
self.button.pack()
def plot (self):
x=np.array ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
v= np.array ([16,16.31925,17.6394,16.003,17.2861,17.3131,19.1259,18.9694,22.0003,22.81226])
p= np.array ([16.23697, 17.31653, 17.22094, 17.68631, 17.73641 , 18.6368,
19.32125, 19.31756 , 21.20247 , 22.41444 , 22.11718 , 22.12453])
fig = Figure(figsize=(6,6))
a = fig.add_subplot(111)
a.scatter(v,x,color='red')
a.plot(p, range(2 +max(x)),color='blue')
a.invert_yaxis()
a.set_title ("Estimation Grid", fontsize=16)
a.set_ylabel("Y", fontsize=14)
a.set_xlabel("X", fontsize=14)
canvas = FigureCanvasTkAgg(fig, master=self.window)
canvas.get_tk_widget().pack()
canvas.draw()
window= Tk()
start= mclass (window)
window.mainloop()
@Aaron, vous pouvez utiliser fig.clf()
pour effacer le chiffre. voir Figure.clf ()