Как если бы это не обеспечивало достаточной гибкости, механизм компоновки дополнительно предоставляет для размещения графических элементов в отведенной для них области параметр anchor помимо заполнения пространства с помощью fill. Параметр anchor принимает константы из библиотеки tkinter, указывающие восемь направлений (N, NE, NW, S и так далее), или константу CENTER (например, anchor=NW). Компоновщику при этом предписывается разместить виджет в желательном месте внутри отведенного для него пространства, если это пространство больше, чем требуется для изображения данного графического элемента.
По умолчанию параметр anchor получает значение CENTER, поэтому виджеты выводятся в центре отведенного им пространства (выделенного им края пустого пространства), если только для них не определено иное местоположение с помощью параметра anchor или они не растянуты с помощью параметра fill. Для демонстрации изменим сценарий gui4, как показано ниже:
Button(win, text=’Hello’, command=greeting).pack(side=LEFT, anchor=N) Label(win, text=’Hello container world’).pack(side=TOP) Button(win, text=’Quit’, command=win.quit).pack(side=RIGHT)
Новым здесь является только то, что кнопка Hello закреплена на северной стороне отведенного ей пространства. Так как эта кнопка была добавлена первой, она получила весь левый край родительского фрейма. Места оказалось больше, чем необходимо кнопке, поэтому по умолчанию она оказывается в середине этого края, как показано на рис. 7.15 (то есть закреплена в центре). После установки якоря в значение N она смещается вверх по левому краю, как показано на рис. 7.18.
Рис. 7.18. Закрепление кнопки на севере
Имейте в виду, что параметры fill и anchor начинают приниматься во внимание только после того как виджету будет выделено место у края пустого пространства, определяемого параметром side, в соответствии с порядком добавления, и запроса дополнительного пространства expand. Путем варьирования порядка добавления, а также значений параметров, определяющих край, направление заполнения и закрепления, можно получить массу эффектов расположения и обрезания, и стоит потратить некоторое время, экспериментируя с разными вариантами, если вы этого еще не сделали. Например, в исходной версии этого при
мера метка занимает весь верхний край только потому, что была добавлена первой.
Как будет показано ниже, фреймы можно вкладывать в другие фреймы, благодаря чему можно создавать довольно сложные структуры. В действительности, каждый родительский контейнер является отдельным пустым пространством, поэтому возникает некоторый механизм обхода для алгоритма выделения пустого пространства компоновщиком: чтобы точнее управлять местом, где будет отображаться некоторая группа виджетов, просто скомпонуйте их во вложенном фрейме и прикрепите этот фрейм как пакет к более крупному контейнеру. Например, ряд расположенных рядом кнопок проще поместить в отдельный фрейм, чем смешивать с остальными виджетами.
Наконец, имейте в виду, что дерево виджетов, создаваемое в этих примерах, в действительности является неявным — библиотека tkinter внутри ведет учет связей, которые образуются в результате передачи аргументов родительских виджетов. На языке ООП это называется композицией — фрейм содержит метку и несколько кнопок. А теперь рассмотрим другой вид связи — наследование.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011