web-dev-qa-db-fra.com

Placer le tracé sur la fenêtre principale de Tkinter dans Python

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.

7
Dania

Principaux changements:

  1. Utiliser matplolib.figure au lieu de matplotlib.pyplot (et renommer toutes les fonctions associées)
  2. Ajout d'une variable self.window
  3. Utiliser pack () partout (vous ne pouvez pas mélanger la grille et emballer dans un seul conteneur.)

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()
20
Eric Levieil

@Aaron, vous pouvez utiliser fig.clf() pour effacer le chiffre. voir Figure.clf ()

0
ugmurthy