Московский Энергетический Институт
Ларионова
Т.С.
Проверила
Пирогова М.А.
___________________________
Москва
Диспетчеры
компоновки предназначены для управления размещением компонентов. Диспетчеры
компоновки pack и grid представляют собой диспетчеры общего назначения, а place применяется
для специальных целей.
Pack – первый из диспетчеров компоновки, реализованных для
Tk. Диспетчер grid стал поддерживаться
начиная с версии Tk 4.1.
Диспетчер
компоновки рассматривает некоторый компонент как родительский, в котором
размещены дочерние, или ведомые, элементы. Родительское окно почти всегда
представляет собой фрейм, но в некоторых случаях в этой роли выступают
компоненты других типов. В каждый момент времени компонент может управляться
только одним диспетчером компоновки, однако для различных компонентов можно
применять разные диспетчеры. Если компонент не находится под управлением
диспетчера, он не отображается на экране.
Диспетчер
компоновки pack
предоставляет достаточно обширные возможности: вместо того чтобы
непосредственно указывать детали размещения компонентов в каждом окне,
программист определяет общие правила позиционирования компонентов, а выполнение
всех действий, необходимых для соблюдения этих правил, берет на себя диспетчер.
В команде pack можно указать одно из четырех направлений top, right, bottom и left, относительно которого дочерние элементы будут по
очереди выравниваться в родительском компоненте. Направление top принимается по умолчанию.
Пример.
Frame .one –width 40 -height 40 –bg
blue
Frame .two –width 100 height 50 –bg
grey
Pack
.one .two –side top
Рис.1
Размеры
окон и команда pack
propagate
Размеры
главного окна в предыдущем примере уменьшились до величины, достаточной для
размещения двух дочерних компонентов. Если вам надо, чтобы окно не
согласовывало свои размеры с размерами дочерних компонентов, надо применить
команду pack propagate к родительскому окну.
Пример.
Frame .one –width 40 -height 40 –bg
blue
Pack propagate .false
Pack
.one .two –side top
Внутри фрейма компоненты могут размещаться по горизонтали или по вертикали. Если попытаться объединить горизонтальное и вертикальное размещение, одновременно задавая различные типы выравнивания, результаты могут оказаться неожиданными. Для достижения желаемого расположения компонентов лучше объявлять несколько фреймов, организуя их взаимное расположения желаемым образом и расположение их дочерних компонент.
Пример.
Размещение в верху окна ряда кнопок.
Frame .one –bg blue
Frame
.two –width 100 –height 50 –bg grey
#Создание ряда кнопок
foreach b {alpha beta gamma}{
button.one.$b –text $b
pack.one.$b –side left
}
pack .one .two –side top
рис.2
Для того чтобы задать следующее расположение компонентов (рис 3) потребуется еще один фрейм.
рис. 3
frame .one –bg white
frame .two –width 100 –hieght 50 –bg grey
foreach b {alpha beta} {
button
.one.$b –text $b
pack
.one.$b –side left
}
frame .one.right
foreach
b {delta epsilon} {
button
.one.right.$b –text $b
pack.one.right.$b –side bottom
}
pack .one.right –side right
pack .one .two –side top
Модель полостей
Алгоритм компоновки распределяет доступное
пространство внутри фрейма в соответствии с моделью полостей. При создании окна
главный фрейм пуст, и пространство для размещения компонентов не определено.
Это пространство принято называть полостью (caviti). Согласно основному правилу компоновки, компонент заполняет
полость по одной из координат.
Пример размещения трех компонентов
в главном окне.
Для первых двух компонент зададим
выравнивание bottom, а для
третьего – тип выравнивания right.
Frame .one –width 100 –height 50 –bg grey
Frame .two –width 40 –hieght 40 –bg grey
Pack .one .two –side bottom
Frame .three –width 20 –height 20 –bg blue
Pack .three –side right
рис. 4
Если при размещении третьего фрейма в главном
окне мы зададим опцию –side
left или –side right, то расположим его в полости, находящейся над двумя
фреймами, которые к этому времени помещены в окно. Причина такого поведения
диспетчера компоновки состоит в том, что фрейм .two занимает всю нижнюю часть полости, несмотря на то, что его
размеры по горизонтали меньше размеров полости. После выполнения приведенного
примера полость будит расположена слева от третьего фрейма.
Каждый из фреймов содержит свою
полость, поэтому для реализации сложного взаимного расположения компонентов приходится
прибегать к помощи вложенных фреймов.
Выполняя упорядочивание компонентов, диспетчер компоновки
оперирует понятиями пространства компоновки и пространства отображения.
Пространство отображения – это область, необходимая компоненту для того, чтобы
он мог быть представлен на экране. Пространство компоновки – это область,
которую диспетчер компоновки выделяет для этого компонента. Из-за особенностей
размещения на экране для компонента может быть выделена область большая или
меньшая, чем необходимо для отображения. Лишнее пространство отсчитывается
вдоль координаты, по которой выравнивается компонент.
Опция –fill
Если при
вызове диспетчера компоновки указана опция –fill, компонент будет занимать все доступное для него
пространство. Заполнение может выполняться по оси Х, Y или по обеим координатам (both).
Пример
frame .one –width 100 –height 50 –bg grey
frame .two –width 40 –height 40 –bg blue
pack .one .two –side bottom –fill x
frame .three –width 20 –hieght 20 –bg red
pack .three –side right –fill x
рис. 5
В
приведенном примере для всех фреймов задана опция –fill х. При этом фреймы .one и .two заполняют
всю область, а фрейм .three – нет.
Такое
поведение фреймов связано с тем, что операция заполнения не затрагивает
полость. Фреймам .one .two выделена вся область от левой до правой границы окна,
поэтому эти фреймы могут быть расширены. Фрейму .three выделена только правая часть верхней полосы окна, в
результате заполнение по координате Х не дает никакого эффекта.
Внутреннее
дополнение, задаваемое с помощью опций –ipadx и –ipady.
Расширить
область, занимаемую компонентом можно также, используя опции –ipadx и –ipady команды pack. Эта опция запрашивает дополнительное пространство по
оси Х и по оси Y. Наличие
ограничений может привести к тому, что запрос не будит удовлетворен, но, как
правило, данные опции позволяют расширить область отображения компонента.
Пример
Frame .menubar –bg green
Frame .body –width 150 –height 50
–bg grey
Foreach b {alpha beta} {
Button .menubar.$b –text $b
}
pack .menubar.alpha –side left
–ipady 10
pack .menubar.beta –side right
–ipadx 10
pack .menubar –side top –fill x
–ipady 5
pack .body
Внутреннее дополнение применяется и при компоновке фрейма, что, с одной стороны, уменьшает размеры полости, а с другой стороны, формирует дополнительную свободную область над кнопками и под ними.
Внутреннее
дополнение предусмотрено и для кнопок. При использовании опций –ipadx и –ipady размеры области отображения, занимаемой кнопками,
увеличивается. При работе с кнопками дополнение обычно используется для того,
чтобы обеспечить интервал между текстом, отображаемым на кнопке и ее краями.
При
указании дополнений используется единица длины области отображения, допустимая
в Tk. Обычно числовое значение
интерпретируется как количество пикселей. Если за числом следует i .m .c или p, то
предполагается соответственно расстояние в дюймах, миллиметрах, сантиметрах или
пунктах.
Внешнее
дополнение, задаваемое с помощью опций –ipadx и –ipady.
Диспетчер компоновки может реализовывать внешнее дополнение, т. е. резервировать область компоновки, в которой не могут размещаться никакие элементы. Это пространство выделяется за пределами обрамления компонента и используется для эмуляции трехмерного пространства.
Пример
Frame .ok
-borderwidth 2 –relief sunken
Button .ok.b –text OK
Pack .ok.b –padx 5 –pady 5
Button .cancel –text Cancel
Pack .ok .cancel –side left –padx5 –pady5
Внешний вид
кнопки .ok.b не изменился бы даже в том случае, если бы при вызове
команды pack была
указана опция –fill both. Дочерний компонент не зхаполняет область дополнения.
В Tk 8.4 была реализована возможность создавать
асимметричное дополнение, указывая в качестве значения опции из двух элементов.
Например, в
приведенном примере добавляется по 5 пикселей слева и справа от компонентов, 3
пикселя выше них и 6 пикселей под ними.
Pack .ok
.cancel –side left –padx 5 –pady {3 6}
Изменение
размеров окон и опция –expand.
Опция –expand true диспетчера компоновки позволяет расширить компонент так,
чтобы он занимал невостребованную полость.
Если расширение разрешено для нескольких компонентов, являющихся дочерними по отношению к одному родительскому компоненту, диспетчер компоновки пропорционально распределяет между ними дополнительное пространство.
Пример
Frame .prop –bg blue –height 80 –width 20
Frame .base –width 120 –height 20 –bg grey
Pack .base –side bottom
Label .foo –text Foo
Pack .prop .foo –side right –expand true
Фрейм .base выравнивается по нижней части окна. Затем фрейм .prop и текстовая метка .foo выравниваются по правой части окна; при этом задается опция
–expand true, но опция –fill не
указывается. Вместо того чтобы разместить компоненты как можно ближе к правому
краю, опция –expand выделяет
каждому из компонентов половину области, свободной после включения компонента .base. Область делится линией, перпендикулярной оси Х. И
компоненты располагаются по центру каждый своей подобласти.
Фиксация.
Если для компонента выделено большее
пространство, чем требуется для его отображения, вы можете размещать компонент
в пределах этого пространства с помощью
опции –anchor, задаваемой при вызове
команды pack. Значения
данной опции принято называть якорями. По умолчанию предполагается фиксация по
центру области. Остальные значения опции –anchor (n, ne, e, se, s, sw, w, nw) ориентируют компонент «по компасу», т.е. задают
направление «север», «северо-восток», «восток» и т.д.
Пример
Frame .prop –bg blue –hieght 80 –width 20
Frame .base –width 120 –hieght 20 –bg grey
Pack .base –side bottom
Label .foo –text Foo
Pack .prop –side right –expand true –anchor sw
Pack .foo –side right –expand true –anchor ne
Данный
пример представляет собой видоизмененный пример из предыдущей главы опцией anchor. Фрейм prop может
перемещаться только вдоль оси Х, поэтому для него доступны лишь три позиции:
левая, правая и центральная. Любое из значений w, nw и sw, опции –anchor приводит к
тому, что фрейм будет расположен в левой части области. Значение center, n или s располагает фрейм по центру. И, наконец, если опция
имеет значение e, se или ne, фрейм
будет расположен в правой части области.
Диспетчер
компоновки поддерживает порядок очередности, в котором дочерние компоненты
помещаются во фрейм. Набор компонентов, включаемых в состав родительского окна,
называют очередью компоновки. По умолчанию очередной дочерний компонент
добавляется в конец очереди компоновки. В результате первый из дочерних
компонентов оказывается ближе других к тому краю окна, который указан в
качестве значения опции –side. Опции диспетчера компоновки –before и –after позволяют
управлять очередью компоновки, а также дают возможность изменять порядок
следования тех компонентов, которые уже включены в родительский фрейм.
Команда pack slaves возвращает список дочерних компонентов.
Компонент
при компоновке можно помещать не только в родительский фрейм, но и в любого из
потомков фрейма. Опция –in команды pack позволяет указать альтернативный родительский
компонент для компоновки.
Пример
Frame .one –bg blue
Frame .two –width 100 –hieght 50 –bg
grey
Foreach b {alpha beta} {
Button .$b –text $b
Pack .$b –in .one –side left
}
frame .one .right
foreach b{delta epsilon} {
button .$b –text $b
pack .$b –in .one.right –side bottom
}
pack .one.right –side right
pack .one .two –side top.
Используя подобный подход, следует помнить, что порядок создания компонента имеет большое значение. Фреймы надо создавать в первую очередь и лишь после этого определять компоненты, которые будут включены в состав фрейма. Окна, предназначенные для отображения на экране, формируют стек окон; при этом те из них, которые были созданы последними, закрывают окна, сформированные ранее.
Команда pack forget исключает компонент из очереди компоновки. В результате
отображение компонента на экране прекращается и он становится невидимым.
Для
управления расположение элементов в стеке окон используются команды raise и lower. Позиция
элементов в стеке определяет их отображение на экране. Окна, занимающие более
высокое положение в стеке, закрывают окна, расположенные ниже. По умолчанию
новые окна создаются в верхней части стека и располагаются поверх окон,
созданных ранее.
Пример
Button .one
Frame .two
Pack .one –in .two
Если
выполнить эти команды, кнопка не будет отображаться на экране. Причина в том,
что фрейм занимает более высокое положение в стеке и закрывает кнопку. Изменить
порядок следования окон в стеке позволяет команда raise.
Raise .one .two
Приведенная
выше команда располагает окно .one
непосредственно над окном .two. Если
второй параметр не указан окно .one будет
помещено в вершине стека. Команда Lower имеет
такой же формат. Если при ее вызове второй параметр не указан, то окно будит
помещено ниже всех остальных окон в стеке. В противном случае оно располагается
непосредственно под окном, расположенным под окном, указанным в качестве
второго параметра.
Правила компоновки
Работая с диспетчером компоновки pack, надо соблюдать
следующие правила.
•
Все элементы в одном фрейме должны быть скомпонованы либо по вертикали
(опции -side top и -side bottom), либо по горизонтали (опции -side
left
и -side right).
Объединяя различные типы выравнивания, очень трудно добиться требуемых
результатов. Если вам надо реализовать сложное взаиморасположение компонентов,
используйте дополнительные фреймы.
• По
умолчанию диспетчер компоновки pack
помещает компоненты в их родительский фрейм. Родительский фрейм должен быть
создан ранее, чем компоненты, предназначенные для размещения в нем.
• Если вы включаете компоненты в другие фреймы,
необходимо помнить о том, что фреймы должны быть созданы раньше компонентов и
расположены в стеке окон ниже их.
• По
умолчанию диспетчер компоновки игнорирует атрибуты width
и height фреймов, в которых должны быть расположены
компоненты. Размеры фрейма изменяются так, чтобы в нем могли поместиться все
требуемые компоненты. Для того чтобы отключить автоматическое изменение
размеров, надо использовать команду pack propagate.
•
При работе диспетчера компоновки используются понятия пространство компоновки
и пространство отображения. Компонент не обязательно занимает все пространство
компоновки, выделенное ему.
•
Опция -fill
разрешает заполнение пространства компоновки по оси Х
по оси Y или в обоих направлениях.
•
Опция -expand true
задает расширение пространства компоновки на те части полости, которые в
противном случае оставались бы невостребованными. Если на дополнительное
пространство претендует несколько компонентов, это пространство распределяется
пропорционально между ними.
• Опции-ipadx и -ipady резервируют дополнительное пространство
отображения в пределах объекта. Это пространство выделяется только в том
случае, если есть реальная возможность сделать это.
•
Опции -padx
и -pady
резервируют дополнительное пространство компоновки за пределами компонента.
Пространство выделяется только в том случае, если есть реальная возможность
сделать это. Компонент ни при каких условиях не заполняет пространство,
выделенное посредством опций -padx и -pady. Для выделения областей
разного размера в качестве значения опции можно указать список из двух
элементов (эта возможность реализована в Tk 8.4).
Диспетчер
компоновки grid
Диспетчер
компоновки grid
размещает компоненты в виде таблицы,
автоматически согласовывая размеры ячеек с размерами компонентов. Диспетчер
компоновки grid
был реализован в Tk
4.1. Вы задаете строки и столбцы, занимаемые компонентами, а размеры ячеек
автоматически подбираются так, чтобы в них
могли поместиться все необходимые компоненты. Этот диспетчер предоставляет
средства для управления размерами строк и столбцов, а также для динамического
изменения размеров таблицы. Не следует применять диспетчеры pack и grid к одному и тому же
компоненту.
Каждая
команда grid
создает новую строку, а указанные в ней компоненты формируют столбцы.
Пример
foreach color {red orange yellow green blue purple} {
label .l$color -text $color -bg white
frame .f$color -background $color -width 100 -height 2
grid .l$color .f$color
}
Диспетчер компоновки grid
создает столбцы размера достаточного для включения наибольшего
компонента. Компоненты меньших размеров располагаются по центру ячеек.
Опция –sticky
Если
размер ячейки оказывается больше, чем размер содержащегося в ней компонента, вы
можете изменять размеры и размещение компонента, задавая опцию -sticky. Данная опция
объединяет функциональные возможности опций -fill и -anchor диспетчера компоновки pack. С помощью этой опции
вы можете указать, с какой из границ ячейки должен непосредственно
соприкасаться компонент. В качестве значения опции -sticky допустимо любое сочетание букв n, e, w и s. Соответственно размеры
и расположение компонента будут изменяться так, чтобы он непосредственно
соприкасался с верхней, правой, левой и нижней границами ячейки. Вы можете
использовать конкатенацию указанных выше букв (например, news) либо разделять их
пробелам или запятыми (например, news).
В примере опция -sticky w
изменяет расположение текстовой метки и выравнивает ее по левому краю ячейки. Опция -sticky ns растягивает закрашенный
фрейм так, что он занимаем высоте всю строку.
Пример Использование
опции -sticky
при вызове команды grid
foreach color {red
orange yellow green blue purple} {
label .l$color
-text $color -bg white
frame .f$color
-background $color -width 100
-height 2
grid .l$color
.f$color
grid.l$color -sticky w
grid .f$color -sticky ns
}
Позиции компонентов в
строках и столбцах таблицы можно указать непосредственно с помощью атрибутов row и column.
Пример
set row 0
foreach color {red orange
yellow green blue purple} {
label .l$color
-text $color -bg white
frame .f$color -background $color -width 100
grid .l$color -row $rov
-column. 0 -sticky w
grid .f$color -row $row
-column 1 -sticky us
incr row
}
Внешнее дополнение, реализуемое с помощью опций –padx и –pady
Задавая опции -padx и -pady, можно укапать
размер свободной области между
компонентом и границами ячейки.
Пример
foreach color {red orange yellow green blue purple} {
label .I$color -text $color -bg white
frame . f$color -background
$color -width 100 -height 2
grid .I$color .f$color
grid –I$color -sticky w -padx 3
grid .f$color -sticky ns -pady 1
}
Внутреннее дополнение, реализуемое
с помощью опций –ipadx и –ipady
Применяя внутреннее
дополнение, вы можете предоставить компоненту большее пространство отображения,
чем он обычно занимает. При использовании внутреннего дополнения размеры
таблицы увеличиваются. В отличие от -ipadx и -ipady, опция -sticky позволяет растянуть некоторые компоненты,
но при этом размеры таблицы останутся неизменными. В примере благодаря
использованию опции -ipady
высота текстовых меток увеличивается.
Пример
foreacb color {red
orange yellow green blue
purple} {
label . I$color
-text $color -bg white
frame .f$color
-background $color -width
100 -height 2
grid .I$color .f$color
grid .I$color -sticky w
-padx 3 -ipady 5
grid .f$color -sticky ns
-pady 1
}
Компонент может занимать несколько ячеек.
Число строк и столбцов, необходимых для размещения компонента, задается с
помощью опции -rowspan
и -columnspan.
. config -bg white
foreach color {888 999
aaa bbb ccc iff} {
frame .$color -bg #$color -width 40 -height 40
}
grid .888 -row 0 -column 0 -columnspan 3 -sticky news
grid .999 -row 1 -column 0 -rowspan 2 -sticky news
grid .aaa -row 1 -column 1 -columnspan 2 -sticky news
grid .bbb -row 2 -column 2 -rowspan 2 -sticky news
grid .ccc -row 3 -column 0 -columnspan 2 -sticky news
grid .fff -row 2 -column 1 -sticky news
При выполнении команды grid, в которой размещение
управляется порядком следования компонентов, бывает необходимо
объединять строки или столбцы либо оставлять свободными ячейки. Для этой цели
предусмотрены специальные символы.
Символ - задает объединение столбцов.
Символ ^ задает объединение строк.
Символ х указывает на то, что ячейка должна
быть пропущена.
При использовании размещения, управляемого
порядком следования команд и их параметров, очень просто вносить небольшие
изменения в раположение элементов. В следующем примере приведен код, с помощью
которого реализуется то же размещение, что и в предыдущем примере.
Config -bg white
foreach color {888
999 aaa bbb ccc ddd fff} {
frame
.$color -bg #$color -width 40
-height 40
}
grid .888 - -
-sticky news
grid .999 .aaa
- -sticky news
grid ^ .fff .bbb -sticky news
grid .ccc -
^ -sticky news
Диспетчер компоновки grid поддерживает атрибуты,
задаваемые для целой строки или столбца. Эти атрибуты управляют размерами
соответствующих ячеек. Для установки атрибутов или определения их текущих
значений используются операции grid rowconfigure
и grid columnconfigure.
grid columnconfigure окно
столбец ?атрибуты?
grid rowconfigure окно
строка ?атрибуты?
Если атрибуты не заданы,
возвращается информация о текущих установках. В качестве второго параметра
может быть задан список, что позволяет одновременно изменять атрибуты
нескольких строк или столбцов.
Дополнение
строк и столбцов
Атрибут
-pad
увеличивает размер ячеек в строке или в столбце. Первоначально размер ячеек
определяется наибольшим компонентом. Опция -pad увеличивает эти размеры. Если даже ячейка
увеличена, существует возможность заполнения ее компонентом. Сделать это
позволяет опция -sticky.
Дополнение строк и столбцов можно сравнить с
внутренним дополнением компонентов, так как выделенное пространство может
быть заполнено. Для сравнения, атрибуты padx и pady компонента создают пустое пространство
между ним и границами ячейки. Это пространство не подлежит заполнению В примере
показано различие между дополнением строки или столбца и дополнением
компонента. Дополнение строки увеличивает ее высоту, в то время как дополнение компонента . f 1 отделяет границы
компонента от границ ячейки.
Пример
. config -bg black
label .f1
-text left -bg #ccc
label . f2 -text right -bg #aaa
grid .fl .f2 -sticky news ;#
дополнение отсутствует
grid .fl -padx
10 -pady 10
;# дополнение для ячейки
grid rowconfigure
. 0 -pad 20 ;# дополнение для строки
Минимальный
размер ячейки
Опция –minsize ограничивает минимальные размеры
ячеек, принадлежащих строке или столбцу. Размеры строк или столбцов могут стать
меньше указанной величины.
Если размеры
родительского окна больше, чем необходимо для отображения таблицы, окно
сжимается до требуемых размеров. Запретить изменение размеров окна можно с
помощью команды grid propagate.
В этом случае таблица будет размещаться по центру окна. Если размеры окна
настолько малы, что в нем не помещается таблица, она фиксируется и левом
верхнем
углу окна, а фрагменты, выступающие
вправо и вниз за границы окна, не
отображаются.
По умолчанию при увеличении родительского
фрейма размеры строк и
и столбцов остаются постоянными. Задать
изменение размеров строки или столбца можно с помощью опции -weight. Значение этой опции
является целое число больше нуля. В примере
показаны текстовый компонент и две полосы прокрутки, обработанные
диспетчером компоновки grid.
Текстовый компонент находится в нулевом столбце нулевой строки и может
расширяться в обоих направлениях. Вертикальная полоса прокрутки расположена в
первом столбце нулевой строки, и размеры ее могут изменяться только в
направлении Y.
И, наконец, горизонтальная полоса прокрутки находится в нулевом столбце первой
строки, поэтому размеры ее могут изменяться только в направлении X.
Пример
text .text
-yscrollcommand ".yscroll set"
\
-xscrollcommand ".xscroll set"-width 40 -height
10
scrollbar .yscroll
-command ".text yview"
-orient vertical
scrollbar .xscroll
-command ".text xview"
-orient horizontal
grid .text .yscroll
-sticky news
grid .xscroll
-sticky ew
grid
rowconfigure . 0
-weight 1
grid columnconf
igure . 0 -weight 1
Для
того чтобы размеры строк пли столбцов по-разному изменялись при увеличении
родительскою окна, надо задать для них различные веса. Однако этой возможностью
надо пользоваться аккуратно, так как изменение размеров происходит только при
наличии дополнительного пространства. Предположим, например, что четыре
столбца таблицы имеют ширину 10. 20, 30 и 40 пикселей. Таким образом, общая их
ширина составляет 100 пикселей. Если ширина родительского окна возрастет до
140 пикселей, окажется, что для отображения таблицы есть 40 дополнительных пикселей. Если для каждого
столбца
был задан вес 1, каждый из них получил бы по 10 пикселей дополнительного
пространства. Теперь предположим, что для столбца 0 задан вес 0 для столбцов 1
и 2 - вес 1 и для столбца 3 - вес 2. Тогда с увеличением размеров родительского
окна столбец 0 не будет увеличиваться, столбцы 1 и 2 получат по 10
дополнительных пикселей и столбец 3
увеличится на 20
дополнительных пикселей. В большинстве случаев применяются веса, равные 0 или
1.
При
сжатии окна наличие весов приводит к возникновению обратного эффекта.
Опция -uniform
Опция -uniform упрощает создание
столбцов (или строк) одинаковой ширины (высоты). С помощью данной опции
создается группа столбцов или строк. Значение опции может быть произвольным (например,
xyz).
Считается, что все столбцы (или строки) с одинаковым идентификатором, заданным
с помощью опции -uniform,
принадлежат одной и той же группе. Если для них задано одно и то же значение
опции -weight,
размеры их будут одинаковыми. Если же, например, один из столбцов или одна из
строк в группе имеет вес, вдвое превышающий вес других столбцов (или строк), то
этот столбец (или строка) будет вдвое больше остальных.
Пример (Ширина столбцов сгруппирована с
помощью опции –uniform)
foreach
x {alpha beta gamma x у
z} {
label .$x -text $x
}
.beta config –bg white
.y config -bg white
grid. alpha .beta .gamma –sticky news
grid .x .y .z –sticky news
grid columnconfigure .”0 1
grid columnconfigure .1 –weight 2
Диспетчер компоновки place
В
данной главе рассматривается диспетчер компоновки place, осуществляющий позиционирование
компонентов на экране.
Диспетчер компоновки place гораздо проще, чем диспетчеры pack и grid. При работе с данным
диспетчером разработчик определяет абсолютные либо относительные позиции и
размеры окон. Такой подход может быть приемлем в некоторых частных случаях, но
если вам необходимо размещать большое число элементов в разных окнах, диспетчер
компоновки place
подходит плохо.
Команда
place
позволяет задавать ширину и высоту окна, а также фиксировать его по
горизонтали и по вертикали. Размеры и расположение могут задаваться как в
абсолютных, так и в относительных
единицах. Относительное позиционирование считается более удобным для создания
интерфейсов. В примере команда place
используется для размещения окна по центру его родительского окно. Подобное
выражение может использоваться для отображения диалоговых окон.
Пример.
Выравнивание окна по центру с помощью диспетчера компоновки place
place $w -in $parent -relx 0.5 -rely 0.5 -anchor center
С
помощью опций -relx
и -rely
компонент $w
фиксируется в окне $parent.
Относительное значение X
(или Y),
равное нулю, соответствует выравниванию компонента по левому (или верхнему)
краю окна $parent.
Значение, равное единице, определяет выравнивание по правому (или нижнему) краю
$parent.
И, наконец, значение 0.5 задает выравнивание по центру. Опция -anchor определяет,
относительно какой позиции окна $w
должна быть выполнена фиксация. В примере указана точка фиксации center; в результате
приведенное выше выражение приводит к выравниванию центра окна $w по центру окна $parent.
Относительная
высота и ширина используются для того, чтобы вычислить размеры одного
компонента, исходя из размеров другого. В данном случае используется точка фиксации
по умолчанию, находящаяся в верхнем углу
окна (nw)
Пример.2.
Использование команды place
для размещения одного окна поверх другого
place $w -in $parent -relwidth 1 -relheight 1 -x
0 -у 0
Абсолютные
размеры окна и размеры, вычисленные относительно другого окна, складываются
(например, в одной команде ширина может быть задана в результате суммарного
действия опций -width
и –relwidth
). Используя обе опции, вы можете сделать ваше окно несколько меньше или
несколько больше родительского. В примере.3 отрицательные значении -width и -hight заданы для того, чтобы уменьшить размеры окна $w относительно $раrent
Пример.3.
Совместное использование опций,
определяющих абсолютны и
относительные размеры
place $w -in $parent -relwidth 1 -relheight
1 -x 0 -у О \ -width - 4 -height - 4
Окно $parent не обязательно должно
быть родительским по отношению к $w. Оно может быть потомком родительского окна или
окном верхнего уровня. Необходимо лишь, чтобы $w было доступным тогда, когда доступно окно
$parent.
Аналогичные правила действуют при использовании диспетчера компоновки pack.
Кроме
того, нет необходимости размещать компонент внутри другого компонента. В
примере 4 окно $w
располагается на пять пикселей выше окна $sibling. Если позиция $sibling изменится, окно $w переместится вместе с
ним. Данный подход применим тогда, когда необходимо разместить в углах окна с
изменяемыми размерами другие компоненты. При увеличении или уменьшении окна эти
компоненты автоматически изменяют свои позиции на экране.
Пример 4. Использование
команды place
для размещения одного окна выше другого
Place $w –in $sibling –relx 0.5 –y –5 –anchor s \
-bordermode outside
Опция
-bordermode outside
указывает на то, что при позиционировании $w обрамление
$sibling
игнорируется. В этом случае позиция вычисляется
Относительно
внешней границы $sibling.
По умолчанию обрамление учитывается, что упрощает размещение окна в
родительском окне.
Родительский
компонент не обязательно должен быть фреймом. В примере 1 предпринимается
попытка поместить диалоговое окно в центре текстового компонента. В примере 4 и
$sibling,
и $w
могут представлять собой текстовые метки.
Основные
сведения о команде Place
Place
окно? Окно..? ?опции? |
Выполняется аналогично place
configure |
Place
configure окно? Окно..?? ?опции? |
Размещает один или несколько компонентов,
учитывая заданные значения опций. Назначения опций описываются в таблице 2 |
Place
forget окно? Окно..? |
Удаляет указанные окна из стека |
Place
info окно |
Возвращает параметры, определяющие
размещение указанного окна |
Place
slaves окно |
Возвращает список компонентов,
содержащихся в указанном окне. |
Таблица 2
-in окно |
Размещение
внутри или относительно указанного окна |
-anchor тип_фиксации |
Значение опции, или якоря: center,
n, ne, e, se, s, sw, w или nw. По
умолчанию принимается nw. |
-x координата |
Позиция
точки. Фиксация по горизонтали. Задается в экранных единицах измерения. |
-relx смещение |
Относительная
позиция по горизонтали: 0.0 – левая граница, 1.0 – правая граница. |
-y координата |
Позиция
точки. Фиксация по вертикали. Задается в экранных единицах измерения. |
-rely смещение |
Относительная
позиция по вертикали: 0.0 – верхняя граница, 1.0 – нижняя граница. |
-width размер |
Ширина
окна в экранных единицах измерения. |
-relwidth размер |
Ширина
окна. Вычисляется относительно ширины родительского окна. Если указано
значение 1.0, окна имеют одинаковую ширину |
-height размер |
Высота
окна в экранных единицах измерения. |
-relheight размер |
Высота
окна. Вычисляется относительно высоты родительского окна. Если указано
значение 1.0, окна имеют одинаковую высоту |
-bordermode режим |
Если
задан режим inside, то
размер и позиция вычисляются относительно части родительского окна, лежащей в
обрамлении. Режим outside
указывает на то, что размер и позиция вычисляются относительно внешней
границы родительского окна. По умолчанию принимается значение inside. |
Фреймы
Как правило, настройка фрейма сводится к установке цвета фона
и обрамления. Для фрейма можно также указать карту отображения цвета и визуальный
тип. Компонент labelframe,
реализованный в Tk 8.4,
представляет собой фрейм, который может отображать компоненты вдоль своего
обрамления. Данный компонент может содержать внутреннюю текстовую метку либо
автоматически осуществляет позиционирование текстовой метки.
Компонент toplevel напоминает
фрейм, но он создается как окно верхнего уровня. Другими словами, он не
обязательно должен размещаться в пределах главного окна приложения. Данный
компонент удобно использовать для создания диалоговых окон. Компонент toplevel содержит те же атрибуты, что и
фрейм, а также дополнительные атрибуты screen и menu. Атрибут
меню используется для создания строки menu,
расположенной вдоль верхней границы окна. В системах Unix опция screen позволяет отобразить компонент в любом окне X Windows. Значение опции screen задается в
следующем формате:
Узел:дисплей.номер экрана
Атрибуты компонентов frame, labelframe и toplevel
В таблице 1 описаны атрибуты компонентов frame, labelframe и toplevel. Для идентификации атрибутов используются
имена ресурсов; слова, составляющие их, начинаются с прописной буквы. При
создании компонента или изменении его конфигурации доступ к атрибутам
осуществляется с помощью опций. Имя опции совпадает с именем атрибута, за
исключением того, что оно начинается с символа и в нем присутствуют только
символы нижнего регистра.
После создания компонентов frame, labelframe и toplevel атрибуты class, colormap, visual и screen изменять нельзя. Эти параметры являются основными,
поэтому, чтобы изменить их, надо удалить фрейм и создать новый.
Таблица 1.
background |
Цвет фона
(имя атрибута может быть сокращено до bg) |
borderwidth |
Дополнительное
пространство вокруг границ фрейма. |
class |
Имя
класса ресурсов и связывания. |
colormap |
В
качестве значения указывается new или имя
окна. |
container |
Если в
качестве значения указано true фрейм
включает другое приложение. |
cursor |
Курсор,
отображаемый в пределах фрейма. |
font |
Шрифт,
используемый для отображения метки. Только для компонента labelframe. |
foreground |
Цвет,
используемый для отображения метки. Только для компонента labelframe. |
height |
Высота,
представленная в экранных единицах измерения. |
highlightBackground |
Цвет,
используемый для подсветки, когда компонент не имеет фокуса ввода. |
highlightColor |
Цвет,
используемый для подсветки, когда компонент имеет фокуса ввода. |
highlightThickness |
Толщина
прямоугольника, указывающего на наличие фокуса ввода |
labelAnchor |
Расположение
встроенной метки. Данный атрибут может
принимать следующие значения: nw
(принимается по умолчанию), n, ne, en, e, es, se, e, sw, ws, w,wn. Только для компонента labelframe. |
labelWidget |
Путь к
компоненту, используемому в качестве метки. Переопределяет установки,
выполненные с помощью опции –text.
Компонент должен существовать. Только для компонента labelframe. |
menu |
Строка
меню. Только для компонента toplevel. |
padx |
Дополнительное
внутреннее пространство слева и справа от содержимого. |
pady |
Дополнительное
внутреннее пространство сверху и снизу от содержимого. |
relief |
Допустимые значения:
flat, sunken, raised, groove, solid и ridge. |
screen |
Спецификация
Х терминала (Только для toplevel.
Указывать в базе данных ресурсов нельзя.) |
takeFocus |
Управляет
изменением фокусом ввода в результате действий с клавиатурой. |
text |
Текст
встроенной метки. Только для компонента labelframe. |
use |
Идентификатор
окна, возвращаемый командой winfoid. Фрейм
или окно верхнего уровня включается в указанное окно. |
visual |
Допустимые типы:
staticgrey, greyscale, staticcolor, pseudocolor, directcolor, truecolor. |
width |
Ширина,
представленная в экранных единицах измерения. |