2016-07-07 9 views
1

Ich lerne, wie man matplotlib verwendet, und jetzt habe ich ein Problem. Wenn ich ein Figure in "tkinter project" anlege und ihm ein Unterplot gebe, verwende ich NavigationToolbar2TkAgg, um eine Symbolleiste zu erstellen. Diese Symbolleiste wird oben im Diagramm angezeigt. Wie kann ich es an anderen Orten, wie unten oder links?Wie kann ich den Speicherort der Werkzeugleiste "NavigationToolbar2TkAgg" verwalten?

Dies ist der Code:

import tkinter as tk 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg 
from matplotlib.figure import Figure 

root = tk.Tk() 
root.title("I am a newbie!") 

# create the figure instances 
fig = Figure() 
a = fig.add_subplot(122) 
b = fig.add_subplot(121) 

# figure1 has two subplot and figure 2 has only one 
fig2 = Figure(figsize=(2, 2)) 
c = fig2.add_subplot(111) 

# create canvas1 
canvas = FigureCanvasTkAgg(fig, root) 
canvas.show() 
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.X) 
# put this to the top of the window 

# toolbar for canvas1 (figure1) 
toolbar = NavigationToolbar2TkAgg(canvas, root) 
toolbar.update() 

# create canvas2 
canvas2 = FigureCanvasTkAgg(fig2, root) 
canvas2.show() 
canvas2.get_tk_widget().pack(side=tk.BOTTOM, fill=tk.X) 
# put this to the bottom 

# toolbar for canvas2 (figure2) 
toolbar2 = NavigationToolbar2TkAgg(canvas2, root) 
toolbar2.update() 


# this function just to exit 
def _quit(): 
    root.quit() 
    root.destroy() 


button = tk.Button(master=root, text='Quit', command=_quit) 
button.pack(side=tk.BOTTOM) 

root.mainloop() 

Dies ist das Fenster, das erscheint:

the screenshot

  • Warum ist die Lage von Symbolleiste1 am unteren

    ?
  • Warum ist Toolbar2 über der Leinwand2?

Ich möchte lernen, wie Sie ihre Standorte einstellen.

+0

Ohne zu viel über tkinter zu wissen, aber es klingt so, als müssten Sie Ihren eigenen Fensterrahmen mit einer Zeichenfläche und einer Werkzeugleiste erstellen. Auf diese Weise können Sie die Symbolleiste an beliebiger Stelle platzieren. Es wird jedoch wahrscheinlich ziemlich viel Arbeit erfordern. – pathoren

+0

Es würde helfen, wenn Sie einen [mcve] machen und Ihren Code gepostet haben. – Ajean

+0

@Ajean, @ pathoren Vielen Dank für Ihre Antwort, und ich bearbeite nur die Frage, könnten Sie einen Blick darauf werfen? :) –

Antwort

1

Wenn ein NavigationToolbar2TkAgg von

toolbar = NavigationToolbar2TkAgg(canvas, window) 

Methode NavigationToolbar2TkAgg._init_toolbar heißt instanziiert wird. Es setzt window als übergeordnetes Widget und am Ende der Methode Aufrufe self.pack(side=Tk.BOTTOM, fill=Tk.X). Dies wirkt sich auf die Platzierung der Symbolleiste in window aus.

Durch Erstellen von tk.Frame Widgets für die Symbolleisten können die Positionen der Symbolleisten geändert werden.

frame1 = tk.Frame(root) 
frame2 = tk.Frame(root) 

canvas = FigureCanvasTkAgg(fig, root) 
toolbar = NavigationToolbar2TkAgg(canvas, frame1) 
canvas2 = FigureCanvasTkAgg(fig2, root) 
toolbar2 = NavigationToolbar2TkAgg(canvas2, frame2) 

frame1.pack(side=tk.TOP, fill=tk.X) 
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.X) 
frame2.pack(side=tk.TOP, fill=tk.X) 
canvas2.get_tk_widget().pack(side=tk.TOP, fill=tk.X) 

button = tk.Button(master=root, text='Quit') 
button.pack(side=tk.TOP) 

Da die Symbolleiste nun in Rahmen platziert werden, der pack() Aufruf für die zweite Symbolleiste keinen Einfluss auf die Schaltfläche beenden.

Die Methode in Frage: github.

+0

Danke! Mit Ihrer Hilfe löse ich dieses Problem endlich! Sag auch dank @pathoren –

Verwandte Themen