2010-11-01 27 views
15

Intento incrustar una trama en mi GUI de Tkinter codificada en Python. Creo que el siguiente código tiene éxito en simplemente poner un gráfico en un lienzo, pero no tengo ningún control de la ubicación del lienzo dentro de la cuadrícula de la GUI. Quiero que una subsección de mi GUI sea la trama ... no la totalidad. ¿Cómo puedo colocar este widget de lienzo?Python Tkinter Incruste Matplotlib en la 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

En una nota no completamente relacionada, su publicación fue muy útil para que mi programa funcione al aprender a aplicar el 'matplotlib.figure.Figure'. Gracias. – deadstump

Respuesta

21

No tiene otros widgets, por lo que es difícil saber dónde desea otros widgets. Sin embargo, esto es lo que puedo decirte: al hacer dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) le estás pidiendo a Tkinter que llene la pantalla con la trama. Esto, porque le pide que complete todas las direcciones (fill=BOTH) y que se expanda para llenar cualquier espacio adicional (expand=1).

Sin embargo, puede agregar otros widgets. pack funciona colocando widgets en un lado de un contenedor. Su contenedor, master, siempre tiene cuatro lados. Así, por ejemplo, si desea crear una barra de herramientas que haría algo como:

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 

Tenga en cuenta que si se pone el código después el código en el que pack la trama, la barra de herramientas aparece en la parte inferior ! Eso es porque TOP, BOTTOM, etc. se refieren al espacio que sobraron de cualquier otro widget que ya haya sido pack ed. La trama ocupa la parte superior, el espacio sobrante está en la parte inferior. Entonces, cuando especifique TOP otra vez, significa "en la parte superior del área debajo de lo que ya está en la parte superior".

Entonces, usted tiene algunas opciones. La mejor opción es hacer sus widgets en el orden en que desea que aparezcan. Si pack la barra de herramientas en la parte superior antes de pack la trama, será la barra de herramientas la que aparecerá en la parte superior. Además, puede colocar la trama en la parte inferior en lugar de en la parte superior y eso también resolverá el problema.

Por cierto, normalmente creo mis widgets en un bloque, luego los coloco en un bloque aparte. Encuentro que hace que el código sea más fácil de mantener.

Otra opción que puede adaptarse a su modelo mental mejor es griden lugar depack. Con grid puede elegir la (s) fila (s) y columna (s) que ocupa el widget. Esto hace que sea fácil establecer cosas en una grilla, pero a expensas de tener que usar un poco más de código.

Por ejemplo, para poner la barra de herramientas en la parte superior y la trama abajo que podría hacer:

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) 

en cuenta que las filas y columnas comienzan en cero. Además, "peso" se refiere a cuánto se expande este widget en relación con otros widgets. Con dos filas de igual peso, se expandirán por igual cuando se cambie el tamaño de la ventana. Un peso de cero significa que no hay expansión. Un peso de 2 por una fila y 1 por otra significa que la primera se expandirá el doble que la segunda.

Para obtener más información, vea this page on grid y this page on pack.