Шаг 44.
Библиотека Tkinter. Компоненты и вспомогательные классы. Стилизуемые компоненты. Компонент Notebook: панель с вкладками
На этом шаге мы рассмотрим назначение, свойства и пример использования этого виджета.
Компонент панели с вкладками представляется классом Notebook. Он также является контейнером, включающим в себя произвольное количество других контейнеров, которые
содержат различные компоненты и выводятся в виде отдельных вкладок, между которыми можно переключаться щелчками на их корешках.
Панель с вкладками поддерживает немного опций:
- padding - задает величину отступов между границей панели и границами содержащихся в ней вкладок в виде дистанции;
- width - указывает ширину панели в виде дистанции;
- height - указывает высоту панели в виде дистанции.
Однако набор поддерживаемых компонентом методов весьма велик:
- add (<Контейнер, который станет вкладкой>[, <Опции вкладки>]) - добавляет заданный первым параметром контейнер в текущую панель в качестве новой
вкладки, указывая для нее записанные последующими параметрами опции. Если заданный контейнер уже присутствует в панели, ничего не делает. Вот доступные опции вкладки:
- text - указывает текст заголовка для вкладки;
- underline - задает номер символа в заголовке, который следует сделать подчеркнутым. Нумерация символов начинается с 0. Если в качестве значения опции указано
отрицательное число, ни один символ заголовка не будет подчеркнут;
- image - указывает изображение, которое будет выводиться в составе заголовка вместе с текстом или вместо него (это зависит от значения опции compound). Изображение
задается в виде экземпляра класса PhotoImage или imageTk.PhotoImage из библиотеки Pillow;
- compound - указывает местоположение изображения относительно текста в заголовке. Доступны значения
- tkinter.LEFT - изображение находится слева от текста,
- tkinter.ТОР - сверху,
- tkinter.RIGHT - справа,
- tkinter.BOTTOM - снизу и
- None - выводится только изображение (поведение по умолчанию).
Эту опцию имеет смысл указывать лишь в случае задания для заголовка изображения;
- padding - задает величину отступов между границей вкладки и границами содержащегося в ней контейнера в виде дистанции;
- sticky - управляет выравниванием контейнера в пространстве вкладки, отведенном под его размещение. Значение параметра должно представлять собой строку, содержащую
следующие символы:
- "w" - левая сторона контейнера прижимается к левой стороне вкладки;
- "n" - верхняя сторона контейнера прижимается к верхней стороне вкладки;
- "е" - правая сторона контейнера прижимается к правой стороне вкладки;
- "s" - нижняя сторона контейнера прижимается к нижней стороне вкладки.
Эти символы для удобства читаемости могут быть разделены запятыми и пробелами.
Если в качестве значения параметра указана пустая строка, контейнер будет расположен в середине вкладки. Значение по умолчанию - "nsew" (т. е. контейнер растягивается на все
пространство вкладки).
Параметр sticky имеет смысл указывать только в том случае, если размеры контейнера меньше размеров вкладки;
- insert (<Индекс вкладки>, <Контейнер, который станет вкладкой>[, <Опции вкладки>]) - вставляет заданный вторым параметром контейнер
в текущую панель в качестве новой вкладки, указывая для нее записанные последующими параметрами опции. Вставленная вкладка помещается перед вкладкой, чей индекс задан первым параметром.
Библиотека Tkinter позволяет указать индекс в виде:
- целого числа - порядковый номер вкладки. Нумерация вкладок начинается с 0;
- ссылки на контейнер, находящийся в нужной вкладке;
- строки "current" - вкладка, выбранная в настоящий момент;
- строки формата "@<Горизонтальная координата>,<Вертикальная координата>" - вкладка, корешок которой содержит точку с заданными координатами.
Координаты записываются в виде целых чисел в пикселях и отсчитываются от левого верхнего угла самой панели.
Если в качестве индекса указать строку "end", новая вкладка будет добавлена в самый конец панели;
- enable_traversal () - при вызове активизирует комбинации клавиш Ctrl+Tab (переход на следующую вкладку) и Shift+Ctrl+Tab (переход на предыдущую вкладку).
Также начинают работать комбинации клавиш вида Аlt+Клавиша, соответствующая подчеркнутому символу в заголовке вкладки;
- select ([<Индекс вкладки>]) - делает выбранной вкладку с указанным индексом.
Если метод вызван без параметра, возвращает ссылку на компонент, находящийся на выбранной в текущий момент вкладке;
- tab (<Индекс вкладки>[, option=<Haзвание опции>] [, <Опции вкладки>]) - выполняет над вкладкой с указанным индексом три разных действия, в зависимости от переданного ему набора параметров:
- если вызван с параметром option - возвращает значение опции, чье название указано в этом параметре:
print(ntb.tab(0, option="text"))
# Результат: Имя
- если вызван с двумя и более параметрами, но параметр option не указан, - задает значения опций, записанных одноименными параметрами:
ntb.tab(0, text="Имя и отчество")
- если вызван с одним параметром - возвращает словарь с текущими значениями всех опций:
print(ntb.tab(0))
# Результат:
# {'padding': [4], 'sticky': 'nsew', 'state': 'normal',
# 'text': 'Имя', 'image': '', 'compound': 'none',
# 'underline': -1}
- hide (<Контейнер>) - временно скрывает указанный контейнер. Чтобы впоследствии вновь вывести его на экран, достаточно воспользоваться методом add();
- forget (<Контейнер>) - удаляет заданный контейнер из панели;
- index (<Индекс вкладки>) - возвращает порядковый номер вкладки с заданным индексом. Индекс может быть указан в виде:
- целого числа - порядковый номер вкладки. Нумерация вкладок начинается с 0;
- ссылки на контейнер, находящийся в нужной вкладке;
- строки "current" - вкладка, выбранная в настоящий момент;
- строки формата "@<Горизонтальная координата>,<Вертикальная координата>" - вкладка, корешок которой содержит точку с заданными координатами.
Координаты записываются в виде целых чисел в пикселях и отсчитываются от левого верхнего угла самой панели.
Вот пара примеров:
# Получаем номер текущей вкладки
ind = ntbNotebook.index("current")
# Получаем номер вкладки, содержащей контейнер frame2
ind = ntbNotebook.index(frame2)
Если вызвать метод index(), передав ему в качестве параметра строку "end", он вернет общее количество вкладок в панели;
- tabs () - возвращает кортеж со ссылками на все находящиеся в текущей панели контейнеры.
При выборе какой-либо вкладки в панели возникает виртуальное событие NotebookTabChanged.
Далее приведен пример использования панели для размещения двух контейнеров с компонентами. Для наглядности размещение компонентов в панели выполнено разными способами - с помощью методов add() и insert():
import tkinter
import tkinter.ttk
class Application(tkinter.ttk.Frame):
def __init__(self, master=None):
super().__init__(master)
# Обязательно указываем ширину и высоту контейнера посредством
# опций width и height соответственно
self.configure(width=200, height=100)
self.pack(padx=4, pady=4)
self.create_widgets()
self.master.title("Пример использования Notebook")
# Запрещаем изменять размеры окна
self.master.resizable(False, False)
def create_widgets(self):
ntb = tkinter.ttk.Notebook(self)
ntb.pack()
frame2 = tkinter.ttk.Frame(ntb)
lblName2 = tkinter.ttk.Label(frame2, text="Фамилия")
lblName2.pack()
entName2 = tkinter.ttk.Entry(frame2)
entName2.pack()
ntb.add(frame2, text="Фамилия", padding=4)
frame1 = tkinter.ttk.Frame(ntb)
lblName1 = tkinter.ttk.Label(frame1, text="Имя")
lblName1.pack()
entName1 = tkinter.ttk.Entry(frame1)
entName1.pack()
ntb.insert (frame2, frame1, text="Имя", padding=4)
ntb.select(0)
root = tkinter.Tk()
app = Application(master=root)
root.mainloop()
Архив с файлом можно взять
здесь.
Результат работы приложения приведен на рисунке 1.

Рис.1. Результат работы приложения
На следующем шаге мы рассмотрим виджет Progressbar.
Предыдущий шаг
Содержание
Следующий шаг