Как стать автором
Обновить

Perl и GUI. Упаковка виджетов

Время на прочтение3 мин
Количество просмотров1.3K
Прежде чем мы рассмотрим основные элементы управления библиотеки 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
Теги:
Хабы:
+5
Комментарии0

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн