# pack

Геометрический менеджер, который упаковывает виджеты по сторонам внутреннего пространства окна.

## СИНТАКСИС

          pack option arg ?arg ...?

## ОПИСАНИЕ

Команда pack используется для управления соответствующим геометрическим менеджером, размещающим виджеты по различным сторонам родительского окна, и для получения от него справочной информации. Команда может иметь перечисленные ниже формы в зависимости от значения аргумента option.

pack slave ?slave ...? ?options?
  Если первый аргумент команды является именем окна (любая величина, начинающаяся с "."), команда выполняется точно также, как команда pack configure.
pack configure slave ?slave ...? ?options?

  Аргумент команды состоит из имени одного или нескольких размещаемых виджетов, после которых идут пары аргументов, состоящих из имени опции и ее значения. Подробное описание действий, выполняемых при размещении виджетов приведено ниже (см. "Алгоритм упаковки pack"). Ниже перечислены возможные опции команды.

  -after other
    Other должно быть именем другого окна. Мастер-окна other используется как мастер для slave. Список slave slave ... вставляется в список размещаемых окон сразу после other.
  -anchor anchor
    Anchor должен быть одной из возможных позиций якоря, например, n или sw. Он определяет как размещается slave в отведенном ему пространстве. Значение по умолчанию c.
  -before other
    Other должно быть именем другого окна. Мастер-окно окна other используется как мастер-окно для slave. Список slave slave ... вставляется в список размещаемых окон непосредственно перед other.
  -expand boolean
    Определяет, будут ли перечисленные виджеты расширяться при наличии свободного пространства в мастер-окне. Boolean должно иметь булево значение, например, 1 или no. Значение по умолчанию "0".
  -fill style

    Если в мастер-окне для slave имеется свободное пространство, управляет растяжением виджета slave.

    Аргумент style может иметь одно из следующих значений:

    none
      Предоставляет виджету slave требуемый размер (включая поля, запрошенные с помощью опций -ipadx или -ipady). Это значение по умолчанию.
    x
      Расширяет виджет slave в горизонтальном направлении так, чтобы он заполнил все свободное пространство (за исключением внешних полей, заданных с помощью опции -padx).
    y
      Расширяет виджет slave в вертикальном направлении так, чтобы он заполнил все свободное пространство (за исключением внешних полей, заданных с помощью опции -pady.)
    both
      Расширяет виджет slave в обоих направлениях.
  -in other
    Включает slave(s) в конец списка размещаемых окон для окна other.
  -ipadx amount
    Аргумент amount указывает размер горизонтальных внутренних полей, которые должны быть с обеих сторон виджета slave. Размер должен быть указан в одной из форм, в которой можно задавать размеры на экране, например, 2 (2 пикселя) или .5c (0.5 сантиметра). Значение по умолчанию 0.
  -ipady amount
    Аргумент amount указывает размер вертикальных внутренних полей, которые должны быть с обеих сторон виджета slave. Размер должен быть указан в одной из форм, в которой можно задавать размеры на экране, например, 2 (2 пикселя) или .5c (0.5 сантиметра). Значение по умолчанию 0.
  -padx amount
    Аргумент amount указывает размер горизонтальных внешних полей, которые должны быть с обеих сторон виджета slave. Размер должен быть указан в одной из форм, в которой можно задавать размеры на экране, например, 2 (2 пикселя) или .5c (0.5 сантиметра). Значение по умолчанию 0.
  -pady amount
    Аргумент amount указывает размер вертикальных внешних полей, которые должны быть с обеих сторон виджета slave. Размер должен быть указан в одной из форм, в которой можно задавать размеры на экране, например, 2 (2 пикселя) или .5c (0.5 сантиметра). Значение по умолчанию 0.
  -side side
    Определяет, к какой стороне мастер-окна будут помещены виджеты slave. Возможные значения аргумента side: left, right, top или bottom. Значение по умолчанию top.

  Если никакая из опций -in, -after или -before не указана, каждый из slave будет внесен в конец списка размещения своего непосредственного родителя (если только он не был внесен туда ранее, в этом случае он останется на своем прежнем месте). Если же одна из перечисленных опций указана, все slave будут внесены в соответствующий список в указанное место.

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

pack forget slave ?slave ...?
  Перечисленные окна удаляются из списка упаковки и с экрана. Эти окна больше не управляются геометрическим менеджером.
pack info slave
  Возвращает список опций и их значений для окна slave в той же форме, в какой они задаются в команде pack configure. Первые два элемента списка "-in master", где "master" - имя окна, в котором размещается slave.
pack propagate master ?boolean?
  Аргумент boolean, если он задан, определяет, будет ли окно master расширяться при необходимости (подробности приведены ниже, см. "Расширение виджетов"). Команда при этом возвращает пустую строку. Если аргумент не задан, команда возвращает текущее значение опции (0 или 1). По умолчанию расширение разрешено.
pack slaves master
  Возвращает список всех размещаемых окон для master. Если в окне master нет размещаемых окон, возвращается пустой список.

## АЛГОРИТМ УПАКОВКИ pack

Для каждого мастер-окна менеджер pack формирует список упаковки. Место каждого виджета в нем может задаваться с помощью опций -in, -after и -before. Если эти опции не использовались, каждый новый виджет добавляется в конец списка своего непосредственного предка.

Менеджер размещает виджеты в окне, последовательно просматривая список упаковки. В момент обработки каждого из размещаемых виджетов внутри мастера есть прямоугольная незаполненная область. Эта область называется "полость". Для первого обрабатываемого виджета "полость" совпадает со всей внутренностью мастер-окна.

Для каждого из размещаемых виджетов выполняются следующие действия:

- менеджер размещает прямоугольную область для очередного виджета у стороны полости, заданной опцией -side. Если значение опции top или bottom, то ширина области равна ширине полости, а высота равна требуемой для виджета высоте плюс внешние и внутренние поля, заданные опциями -ipady и -pady. Если значение опции равно left или right, высота области равна высоте полости, а ширина определяется размером виджета плюс полями, заданными опциями -ipadx и -padx. Область может быть расширена в одном или обоих направлениях в зависимости от значения опции -expand (см. ниже "Расширение виджетов").
- менеджер определяет размеры виджета. Обычно они равны размерам, необходимым для виджета, плюс удвоенные внутренние поля, но могут быть расширены до размеров области (минус удвоенные внешние поля) по одному или обоим направлениям в зависимости от значения опции -fill.
- менеджер размещает виджет в отведенном ему пространстве. Если виджет меньше свободного пространства, используется значение опции -anchor. Если определены внешние поля, то они всегда сохраняются между виджетом и границами области, в которой он помещается.

После того, как очередной виджет размещен, выделенная ему область (см. 1)) вычитается из полости. Полость для следующего виджета остается прямоугольной, но меньшей по размеру. Если виджет не занял полностью выделенную ему область, ее оставшиеся свободными части не используются при размещении последующих виджетов. Если полость оказывается мала для очередного виджета, он получает столько пространства, сколько осталось. Если полость сокращается до нуля, все оставшиеся виджеты в списке упаковки удаляются с экрана. Если размеры окна будут увеличены, они появятся на экране.

## РАСШИРЕНИЕ ВИДЖЕТОВ

Если мастер-окно оказалось больше, чем необходимо для размещения всех виджетов, оставшееся пространство распределяется равномерно между теми виджетами, для которых установлена опция -expand. Дополнительное горизонтальное пространство распределяется между теми виджетами, у которых опция -side равна left или right. Вертикальное пространство распределяется между виджетами, у которых опция -side равна top или bottom.

## РАСПРОСТРАНЕНИЕ РАЗМЕРОВ

Обычно менеджер рассчитывает размеры мастер-окна, необходимые для размещения виджетов, и, при необходимости, устанавливает размеры мастер-окна таким образом, чтобы в нем в точности поместились все виджеты из списка. Это приводит к тому, что информация о размерах виджетов распространяется по иерархическому дереву виджетов, в результате чего целое поддерево изменяет свои размеры при изменении одного из листьевых элементов. Однако команда pack propagate может быть использована для отключения этого механизма для одного или нескольких мастер-окон. Если распространение размеров отключено, информация о необходимых размерах не передается мастер-окну. Это может оказаться полезным, если вы хотите, чтобы мастер-окно сохраняло те размеры, которые вы определили.

## ОГРАНИЧЕНИЯ НА МАСТЕР-ОКНА

Мастер-окно для каждого размещаемого виджета должно быть его непосредственным предком (по умолчанию) или одним из потомков его предка. Это ограничение гарантирует разумное поведение виджетов при удалении toplevel-окон.

## ПОРЯДОК РАЗМЕЩЕНИЯ

Если мастер-окно для виджета не является его непосредственным предком, необходимо быть уверенным, что виджет лежит в стеке окон выше, чем мастер-окно. В противном случае мастер-окно закроет собой виджет и создастся впечатление, что виджет не упакован правильным образом. Простейший способ избежать подобных проблем следить, чтобы -окно было создано раньше, чем виджет (чем позже создано окно, тем выше оно в стеке). Если это почему-либо неудобно, можно использовать команды raise и lower для изменения порядка окон в стеке.