Прежде чем мы рассмотрим основные элементы управления библиотеки Tk, нео��ходимо научиться упаковывать виджеты на форме.

Существует несколько упаковщиков, это pack, place, grid. Каждый из них подходит под определенные задачи, но grid является наиболее эффективным.

grid это таблица, и все виджеты располагаются в ее ячейках. Позиция указывается через строку и столбец, соответственно row и column.

вызывать можно как напрямую через Tkx: Tkx::grid( $объект, ... )
так и через родителя(им может выступать любой виджет, обычно окно или фрейм)
$объект->g_grid( ... )

Одна таблица, может быть вложена в другую в зависимости от иерархии.


Аргументы представляют из себя хеш-массив.
Виджет необязательно должен находиться только в одной ячейке, он может занимать как несколько строк, так и несколько столбцов (rowspan, columnspan). Помимо всего этого, мы можем устанавливать отступы (как внутренние так и внешние), а также настройки «липкости», т.е растягивание виджета в нужные стороны относительно краев ячейки.

Индексы строки/столбца нумеруются с 0..n

Рассмотрим пример:
#!/usr/bin/perl
use strict;
use Tkx;

my $mw = Tkx::widget->new( '.' );
my $b1 = $mw->new_ttk__button( -text => 'button 1');
my $b2 = $mw->new_ttk__button( -text => 'button 2');
my $b3 = $mw->new_ttk__button( -text => 'button 3');

$b1->g_grid( -row => 0, -column => 0 );
$b2->g_grid( -row => 0, -column => 1 );
$b3->g_grid( -row => 1, -column => 1 );

Tkx::MainLoop();


image

А теперь попробуем, расширить «button 3» на две ячейки
$b3->g_grid( -row => 1, -column => 0, -columnspan => 2 );


image

«Липкость»



Все хорошо, но мы же хотели, чтобы кнопка занимала именно две ячейки, а не выравнивалась по центру. Для этого мы ей зададим липкость.

Для указания липкости(sticky) используются следующие направления:
image
растягивание по всем краям — «nsew»
север — north
юг — south
восток — east
запад — west


Нам нужно, чтобы она растянулась по левому и по правому краю, значит sticky — восток-запад, «ew»

$b3->g_grid( -row => 1, -column => 0, -columnspan => 2, -sticky => "ew" );


image

Теперь сделаем отступы между кнопками. Это можно сделать, используя следующие опции
padx — отступы по оси Х
pady — отступы по оси Y
ipadx — отступ по оси Х (внутренний)
ipady — отступ по оси Y (внутренний)


$b1->g_grid( -row => 0, -column => 0, -padx => q/10 5/, -pady => q/10 5/ );
$b2->g_grid( -row => 0, -column => 1, -padx => q/5 10/ );
$b3->g_grid( -row => 1, -column => 0, -columnspan => 2, -sticky => "ew", -ipady => 10 );


Получим вот такую картину:
image

Кнопка 3 расширена по Y, потому что мы задали внутренний отступ ipady, а sticky требует растягивания по всем краям.

Изменение размеров виджета при растягивании окна.


grid удобен тем, что он дает возможность сразу установить параметры для отдельно взятой строки или столбца
grid_rowconfigure( индекс, ... ) — для строки
grid_columnconfigure( индекс, ...) — для столбца

Аргументы:
minsize — минимально-допустимый размер
weight — вес

weight играет важную роль, указывает в какой пропорции должны нах��диться виджеты при изменении размера родительского окна (таблицы).

Вернемся к первому примеру:
image

А теперь, установим липкость для кнопок «new» север-восток-запад, и вес для column 0 = 1, column 1 = 1,
т.е при растягивании соотношение в размере по оси Х между двумя колонками было 1:1
$mw->g_grid_columnconfigure( 0, -weight => 1 );
$mw->g_grid_columnconfigure( 1, -weight => 1 );


image

Если вместо -weight => 1 указать 2, то это будет выглядить так: (2:1)

image