Прежде чем мы рассмотрим основные элементы управления библиотеки Tk, нео��ходимо научиться упаковывать виджеты на форме.
Существует несколько упаковщиков, это pack, place, grid. Каждый из них подходит под определенные задачи, но grid является наиболее эффективным.
grid это таблица, и все виджеты располагаются в ее ячейках. Позиция указывается через строку и столбец, соответственно row и column.
вызывать можно как напрямую через
так и через родителя(им может выступать любой виджет, обычно окно или фрейм)
Одна таблица, может быть вложена в другую в зависимости от иерархии.
Аргументы представляют из себя хеш-массив.
Виджет необязательно должен находиться только в одной ячейке, он может занимать как несколько строк, так и несколько столбцов (rowspan, columnspan). Помимо всего этого, мы можем устанавливать отступы (как внутренние так и внешние), а также настройки «липкости», т.е растягивание виджета в нужные стороны относительно краев ячейки.
Индексы строки/столбца нумеруются с 0..n
Рассмотрим пример:

А теперь попробуем, расширить «button 3» на две ячейки

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

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

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

Кнопка 3 расширена по Y, потому что мы задали внутренний отступ ipady, а sticky требует растягивания по всем краям.
grid удобен тем, что он дает возможность сразу установить параметры для отдельно взятой строки или столбца
Аргументы:
minsize — минимально-допустимый размер
weight — вес
weight играет важную роль, указывает в какой пропорции должны нах��диться виджеты при изменении размера родительского окна (таблицы).
Вернемся к первому примеру:

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

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

Существует несколько упаковщиков, это 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();

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

«Липкость»
Все хорошо, но мы же хотели, чтобы кнопка занимала именно две ячейки, а не выравнивалась по центру. Для этого мы ей зададим липкость.
Для указания липкости(sticky) используются следующие направления:

растягивание по всем краям — «nsew»
север — north
юг — south
восток — east
запад — west
Нам нужно, чтобы она растянулась по левому и по правому краю, значит sticky — восток-запад, «ew»
$b3->g_grid( -row => 1, -column => 0, -columnspan => 2, -sticky => "ew" );

Теперь сделаем отступы между кнопками. Это можно сделать, используя следующие опции
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 );
Получим вот такую картину:

Кнопка 3 расширена по Y, потому что мы задали внутренний отступ ipady, а sticky требует растягивания по всем краям.
Изменение размеров виджета при растягивании окна.
grid удобен тем, что он дает возможность сразу установить параметры для отдельно взятой строки или столбца
grid_rowconfigure( индекс, ... ) — для строкиgrid_columnconfigure( индекс, ...) — для столбцаАргументы:
minsize — минимально-допустимый размер
weight — вес
weight играет важную роль, указывает в какой пропорции должны нах��диться виджеты при изменении размера родительского окна (таблицы).
Вернемся к первому примеру:

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

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

