Как я могу управлять расположением панели инструментов NavigationToolbar2TkAgg?

Я изучаю, как использовать matplotlib, и теперь у меня проблема. Когда я создаю Figure в «проекте tkinter» и даю ему подзаговор, я использую NavigationToolbar2TkAgg для создания панели инструментов. Эта панель инструментов появляется в верхней части графика. Как я могу установить его в другое место, например, внизу или слева?

Это код:

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()

Это окно, которое появляется:

скриншот

  • Почему расположение панели инструментов 1 внизу?
  • Почему панель инструментов2 находится над холстом2?

Я хочу научиться устанавливать их местоположение.


person zhou plus    schedule 07.07.2016    source источник
comment
Не слишком много зная о tkinter, но похоже, что вам может понадобиться создать собственную оконную рамку с холстом фигуры и панелью инструментов. Таким образом, вы можете разместить панель инструментов в любом месте. Однако это, вероятно, потребует некоторой работы.   -  person pathoren    schedule 07.07.2016
comment
Будет полезно, если вы сделаете минимально воспроизводимый пример и опубликуете свой код.   -  person Ajean    schedule 08.07.2016
comment
@Ajean @pathoren Спасибо за ваш ответ, и я просто редактирую вопрос, не могли бы вы взглянуть? :)   -  person zhou plus    schedule 08.07.2016


Ответы (1)


Когда NavigationToolbar2TkAgg создается экземпляром

toolbar = NavigationToolbar2TkAgg(canvas, window)

вызывается метод NavigationToolbar2TkAgg._init_toolbar. Он устанавливает window в качестве родительского виджета и в конце метода вызывает self.pack(side=Tk.BOTTOM, fill=Tk.X). Это влияет на то, как панель инструментов размещается внутри window.

Создав tk.Frame виджеты для панелей инструментов, можно изменить расположение панелей инструментов.

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)

Поскольку панели инструментов теперь размещены внутри фреймов, вызов pack() для второй панели инструментов не влияет на кнопку выхода.

Рассматриваемый метод: github.

person J.J. Hakala    schedule 08.07.2016
comment
Благодарю вас ! С вашей помощью я наконец решил эту проблему! Также скажите спасибо @pathoren - person zhou plus; 08.07.2016