2010-11-01 8 views
15

Sto cercando di incorporare una trama nella mia GUI Tkinter codificata in Python. Credo che il codice sottostante riesca semplicemente a inserire un grafico in una tela, ma non ho alcun controllo sulla posizione della tela all'interno della griglia della GUI. Voglio essere in grado di avere una sottosezione della mia GUI sia la trama ... non la totalità di essa. Come posso posizionare questo widget canvas?Python Tkinter Embed Matplotlib nella GUI

#!/usr/apps/Python/bin/python 
import matplotlib, sys 
matplotlib.use('TkAgg') 
from numpy import arange, sin, pi 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 
from Tkinter import * 

master = Tk() 
master.title("Hello World!") 
#------------------------------------------------------------------------------- 

f = Figure(figsize=(5,4), dpi=100) 
a = f.add_subplot(111) 
t = arange(0.0,3.0,0.01) 
s = sin(2*pi*t) 
a.plot(t,s) 


dataPlot = FigureCanvasTkAgg(f, master=master) 
dataPlot.show() 
dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) 
#------------------------------------------------------------------------------- 
master.mainloop() 
+2

Su una nota non del tutto indipendente, il tuo post mi è stato di grande aiuto per far funzionare il mio programma imparando come applicare il 'matplotlib.figure.Figure'. Grazie. – deadstump

risposta

21

Non hai altri widget quindi è difficile sapere dove vuoi altri widget. Ecco cosa posso dirti: facendo dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) stai chiedendo a Tkinter di riempire lo schermo con la trama. Questo perché lo chiedi di compilare tutte le direzioni (fill=BOTH) ed espandilo per riempire qualsiasi spazio aggiuntivo (expand=1).

Tuttavia, è possibile aggiungere altri widget. pack funziona mettendo i widget su un lato di un contenitore. Il tuo contenitore, master, ha sempre quattro lati. Così, per esempio, se si voleva creare una barra degli strumenti si dovrebbe fare qualcosa di simile:

toolbar = tk.Frame(master) 
button = tk.Button(toolbar, text="Push me") 
button.pack(side="left") # left side of parent, the toolbar frame 
toolbar.pack(side=TOP, fill="x") # top of parent, the master window 

Si noti che se si mette questo codice dopo codice in cui si pack la trama, la barra degli strumenti si presenta sul fondo ! Questo perché TOP, BOTTOM, ecc. Si riferiscono allo spazio rimasto da qualsiasi altro widget che sia già stato pack ed. La trama occupa la parte superiore, lo spazio rimasto è in basso. Quindi, quando si specifica TOP di nuovo significa "nella parte superiore dell'area sottostante qualsiasi cosa sia già in cima".

Quindi, avete alcune scelte. La scelta migliore è quella di rendere i tuoi widget nell'ordine in cui desideri che vengano visualizzati. Se hai pack la barra degli strumenti in alto prima del tuo pack il grafico, sarà la barra degli strumenti che compare in alto. Inoltre, puoi posizionare la trama in fondo anziché in alto e questo risolverà anche il problema.

A proposito, in genere creo i miei widget in un blocco, quindi li espongo in un blocco separato. Trovo che rende il codice più facile da mantenere.

Un'altra scelta che può andare bene il vostro modello mentale migliore è quello di gridinvece dipack. Con grid puoi scegliere la (e) riga (e) e colonna (e) che occupa il widget. In questo modo è facile disporre le cose in una griglia, ma a spese di dover usare un po 'più di codice.

Ad esempio, per mettere la barra degli strumenti in alto e la trama in basso si potrebbe fare:

toolbar.grid(row=1, column=1, sticky="ew") 
dataPlot.get_tk_widget().grid(row=1, column=1, sticky="nsew") 
master.grid_rowconfigure(0, weight=0) 
master.grid_rowconfigure(1, weight=1) 
master.grid_columnconfigure(0, weight=1) 

Si noti che le righe e le colonne partono da zero. Inoltre, "peso" si riferisce a quanto questo widget si espande rispetto ad altri widget. Con due file di uguale peso, si espandono equamente quando la finestra viene ridimensionata. Un peso pari a zero significa nessuna espansione. Un peso di 2 per una riga e 1 per un'altra significa che il primo si espanderà il doppio rispetto al secondo.

Per ulteriori informazioni, vedere this page on grid e this page on pack.

Problemi correlati