Прежде чем мы рассмотрим основные элементы управления библиотеки 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)