Forum >> Programmazione Python >> Calcolo scientifico >> Come combinare tkinter e matlpltlib insieme?

Pagina: 1

Buongiorno comunità, ho un problema da risolvere e cerco ogni utile contributo:




Quesito: Se creo uno spazio di lavoro con tknter, grazie all'uso dei frame so come collocare gli oggetti: pulsanti, Entry, .... Ma se in un frame volessi mettere un grafico di matplotlib in uno di quei frame come dovrei fare?




Per esempio se questo lo volessi gestire insieme ad altri oggetti come dovrei fare?:



import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
langs = ['V1', 'V2']
data = [23,17]
X=np.arange(2)


ax.bar(langs,data)

plt.show()
Per esempio se questo lo volessi gestire insieme ad altri oggetti come dovrei fare?: ...
Probabilmente serve a poco, dato il tempo trascorso, ho letto tardi il post ed ho dovuto trovare qualche ritaglio di tempo per fare qualche ricerca, non conosco matplotlib ma l'argomento mi ha intrigato, sono giunto a poter fare una minimale esemplificazione sulla richiesta dello OP e, quindi, rispondo nel caso sia utile a qualcuno.

Bisogna fare alcune premesse :

: matplotlib può utilizzare diverse interfacce di backend per il suo funzionamento, alcune interattive, altre no, tra i backends interattivi vi sono un paio dedicati a tkinter ("TkAgg" e "TkCairo"), detti banckend possono venire inizializzati tramite la funzione "matplotlib.use(backend, *, force=True)", maggiori dettagli nella documentazione.

: matplotlib fornisce degli strumenti per interfacciarsi ai vari backends nel modulo "matplotlib.backends" ed in particolare degli oggetti di interfaccia a tkinter con "backend_tkagg".
Particolarmente interessante è lo strumento "FigureCanvas" nelle sue varie declinazioni, probabile "contenitore" finale di un grafico da realizzarsi. La API specifica è piuttosto scarna e rimanda agli stralci di codice relativi alla rispettiva implementazione, per comprendere bene il funzionamento è probabile occorra un notevole lavoro di analisi degli oggetti sub-classati nei vari step di definizione delle classi.


Altro interessante "strumento" è la classe "Figure" del modulo "matplotlib.figure", fornisce un oggetto astratto per la definizione dei grafici, la API è articolata e da studiarsi.




Con detti "mezzi" è possibile realizzare uno sbrigativo esempio di "plottaggio" di un grafico in una finestra tkinter, il sottostante codice

# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import tkinter as tk


class MyApp(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('Prova Domedron')
        self._populate()

    def _populate(self):
        fig = self._fig_base()
        self.canvas = FigureCanvasTkAgg(fig, self)
        self.canvas.draw()
        self.canvas.get_tk_widget().grid(row=0, column=0, sticky='nsew')

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)

    def _fig_base(self):
        fig = Figure()
        ax = fig.add_axes([0, 0, 1, 1])
        langs = ['V1', 'V2']
        data = [23, 17]
        ax.bar(langs, data)
        return fig


if __name__ == '__main__':
    app = MyApp()
    app.mainloop()
Crea il grafico proposto da @Domedrom in una finestra tkinter, la figura del grafico viene ridimensionata con la finestra.

Nell'esempio ci si è limitati alla mera realizzazione e visualizzazione del grafico proposto, sarebbe stato più interessante ma anche più lungo, esporre una definizione interattiva del grafico, sempre fattibile se occorre ma la "ossatura" necessaria è già contenuta nell'esempietto soprastante (e nella docs)

Fatti non foste a viver come bruti...


Pagina: 1



Esegui il login per scrivere una risposta.