2010-11-01 14 views
15

Ich versuche ein Plot in meine Tkinter GUI einzubetten, die in Python kodiert ist. Ich glaube, dass es dem folgenden Code gelingt, ein Diagramm einfach in ein Canvas zu setzen, aber ich habe keine Kontrolle über den Canvas-Speicherort innerhalb des GUI-Rasters. Ich möchte in der Lage sein, einen Teilbereich meiner GUI als Handlung zu haben ... nicht die Gesamtheit davon. Wie kann ich dieses Canvas-Widget positionieren?Python Tkinter Betten Matplotlib in die GUI ein

#!/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

Auf eine nicht ganz unzusammenhängende Notiz war Ihr Beitrag sehr hilfreich für mich, um mein Programm arbeiten zu lernen, wie man die 'matplotlib.figure.Figure' anwendet. Vielen Dank. – deadstump

Antwort

21

Sie haben keine anderen Widgets, daher ist es schwer zu wissen, wo Sie andere Widgets haben möchten. Hier ist, was ich Ihnen sagen kann: indem Sie dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1) tun, bitten Sie Tkinter, den Bildschirm mit der Handlung zu füllen. Dies, weil Sie es bitten, alle Richtungen (fill=BOTH) auszufüllen und zu erweitern, um zusätzlichen Raum (expand=1) zu füllen.

Sie können jedoch weiterhin andere Widgets hinzufügen. pack funktioniert, indem Widgets auf einer Seite eines Containers platziert werden. Ihr Container, master, hat immer vier Seiten. So zum Beispiel wollen, wenn Sie eine Symbolleiste erstellen Sie etwas tun würden, wie:

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 

Beachten Sie, dass, wenn Sie diesen Code zu setzen nach den Code, wo Sie pack die Handlung, die Werkzeugleiste auf der Unterseite zeigen nach oben ! Das liegt daran, dass sich TOP, BOTTOM usw. auf den Speicherplatz beziehen, der von anderen Widgets übriggelassen wird, die bereits pack ed sind. Die Handlung nimmt die Spitze auf, der verbleibende Raum ist unten. Wenn Sie also erneut TOP angeben, bedeutet dies "oben im Bereich unter dem, was bereits oben ist".

Sie haben also eine Auswahl. Die beste Wahl ist, Ihre Widgets in der Reihenfolge zu erstellen, in der sie angezeigt werden sollen. Wenn Sie pack die Symbolleiste an der Spitze vor Ihnen pack der Handlung, wird es die Symbolleiste sein, die ganz oben angezeigt wird. Außerdem können Sie das Diagramm ganz unten und nicht oben platzieren, wodurch das Problem ebenfalls gelöst wird.

Übrigens, ich meine Widgets in der Regel in einem Block erstellen, dann legen Sie sie alle in einem separaten Block. Ich finde es macht den Code einfacher zu pflegen.

Eine andere Wahl, die Ihr mentales Modell besser passen können, ist zu gridstattpack. Mit grid können Sie die Zeile (n) und Spalte (n) auswählen, die das Widget belegt. Dies macht es leicht, Dinge in einem Raster zu legen, aber auf Kosten von ein wenig mehr Code zu verwenden.

Um zum Beispiel die Symbolleiste oben zu setzen und die Handlung unten Sie tun könnten:

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) 

Beachten Sie, dass Zeilen und Spalten bei Null beginnen. "Gewichtung" bezieht sich auch darauf, wie stark sich dieses Widget im Vergleich zu anderen Widgets ausdehnt. Mit zwei gleichgewichtigen Reihen werden sie gleichmäßig erweitert, wenn das Fenster in der Größe geändert wird. Ein Gewicht von Null bedeutet keine Expansion. Ein Gewicht von 2 für eine Reihe und 1 für eine andere bedeutet, dass ersteres sich doppelt so stark ausdehnt wie das zweite.

Weitere Informationen finden Sie unter this page on grid und this page on pack.

Verwandte Themen