Московский Энергетический Институт

 

 

 

 

 

 

 

 

 

 

 

 

Геометрический менеджер

Фреймы и диспетчеры компоновки

 

 

 

 

 

 

Выполнила студентка группы А6-01

Ларионова Т.С.

Проверила Пирогова М.А.

___________________________

 

 

                                    

 

 

 

 

 

 

 

 

 

 

                                               Москва 2005 г.

 

Диспетчер компоновки pack

 

Диспетчеры компоновки предназначены для управления размещением компонентов. Диспетчеры компоновки 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                                                          

Frame .two –width 100 height 50 –bg grey

        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 2” –uniform group1 –weight 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

Ширина, представленная в экранных единицах измерения.

 

Hosted by uCoz