Python Tkinter Встроить Matplotlib в графический интерфейс - PullRequest
19 голосов
/ 02 ноября 2010

Я пытаюсь встроить график в мой графический интерфейс Tkinter, написанный на Python.Я полагаю, что приведенный ниже код преуспевает в простом размещении графика на холсте, но я не контролирую местоположение холста в сетке GUI.Я хочу, чтобы часть моего 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()

1 Ответ

23 голосов
/ 02 ноября 2010

У вас нет других виджетов, поэтому сложно узнать, где вы хотите другие виджеты. Вот что я могу вам сказать: выполнив dataPlot.get_tk_widget().pack(side=TOP, fill=BOTH, expand=1), вы просите Tkinter заполнить экран сюжетом. Это потому, что вы просите его заполнить все направления (fill=BOTH) и развернуть, чтобы заполнить все дополнительные пробелы (expand=1).

Однако вы все равно можете добавить другие виджеты. pack работает, помещая виджеты на одну сторону контейнера. Ваш контейнер master всегда имеет четыре стороны. Так, например, если вы хотите создать панель инструментов, вы должны сделать что-то вроде:

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

Обратите внимание, что если вы поставите этот код после кода, в котором вы pack построите график, панель инструментов появится внизу! Это потому, что TOP, BOTTOM и т. Д. Относятся к пространству, оставленному любыми другими виджетами, которые уже были pack ed. Сюжет занимает вершину, оставшееся пространство находится внизу. Поэтому, когда вы снова указываете TOP, это означает «вверху области ниже того, что уже находится вверху».

Итак, у вас есть выбор. Лучший выбор - сделать ваши виджеты в том порядке, в котором вы хотите их видеть. Если вы pack панель инструментов вверху, прежде чем вы pack график, это будет панель инструментов, которая отображается в самом верху. Кроме того, вы можете разместить график внизу, а не сверху, и это тоже решит проблему.

Кстати, я обычно создаю свои виджеты в одном блоке, а затем выкладываю их все в отдельный блок. Я считаю, что это облегчает поддержку кода.

Другой выбор, который может лучше соответствовать вашей ментальной модели, - это grid вместо pack. С помощью grid вы можете выбрать строку (и) и столбцы, которые занимает виджет. Это позволяет легко размещать вещи в сетке, но за счет необходимости использовать немного больше кода.

Например, чтобы поместить панель инструментов вверху, а график внизу, вы можете сделать:

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)

Обратите внимание, что строки и столбцы начинаются с нуля. Кроме того, «вес» относится к тому, насколько этот виджет расширяется относительно других виджетов. С двумя рядами одинакового веса они будут расширяться одинаково при изменении размера окна. Вес ноль означает отсутствие расширения. Вес 2 для одного ряда и 1 для другого означает, что первый увеличится вдвое больше, чем второй.

Для получения дополнительной информации см. эту страницу на сетке и эту страницу на упаковке .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...