Pull to refresh

Perl и GUI. Виджеты

Reading time4 min
Views3.1K
Эта статья будет продолжением обзора виджетов графической библиотеки Tk (tkx).

image

Мы рассмотрим:
Label
Button
Entry
CheckButton
RadioButton
ComboBox
Frame


ttk::button
Виджет представляет из себя обычную кнопку, при нажатии которой выполняется какое-либо действие (command).

button находится в пространстве имен ttk, поэтому используя модуль Tkx, конструктор будет выглядеть так:
my $button = $parent->new_ttk__button(%args);

Наиболее часто используемые аргументы:
-text — надпись на кнопке
-command — колбек вызываемый при нажатии (invoke).
-width — длина (вычисляется в символах), обычно нет необходимости в использовании
-state — состояние виджета (может быть: normal, disabled)

Значения параметров можно изменять во время выполнения программы, с помощью метода configure:
$button->configure(%args)

Небольшой пример:
Разместить на форме две кнопки (первая активная, вторая неактивная), при нажатии одной, активируется другая.

image

#!/usr/bin/perl
use strict;
use Tkx;

my $mw = Tkx::widget->new('.');
   $mw->g_wm_minsize(250,100);

my $button_1 = $mw->new_ttk__button(-text => 'Button 1');
my $button_2 = $mw->new_ttk__button(-text => 'Button 2', -state => 'disabled');

$button_1->configure(
    -command => sub {
        $button_1->configure(-state => 'disabled');
        $button_2->configure(-state => 'normal');
    },
);

$button_2->configure(
    -command => sub {
        $button_2->configure(-state => 'disabled');
        $button_1->configure(-state => 'normal');
    },
);

Tkx::grid($button_1, -row => 0, -column => 0, -padx => 10, -pady => 10);
Tkx::grid($button_2, -row => 0, -column => 1, -padx => 10, -pady => 10);

Tkx::MainLoop();


ttk::label
Обычная надпись, можно использовать разные шрифты.

Текст можно задавать двумя способами, либо через опцию -text, либо -textvariable (указатель на переменную).
my $label = $parent->new_ttk__label(-text => 'Static text');
или
my $textval = 'something';
my $label = $parent->new_ttk__label(-textvariable => \$textval);

Опции:
-text — текст.
-textvariable — переменная, которая хранит текст надписи
-font, -background, -foreground — шрифт, цвета фона и надписи.
-justify — выравнивание текста, задается подобно запад-восток, юго-запад (подробнее читайте в Perl и Tkx. Упаковка виджетов).
-relief — рельеф надписи (flat, groove, raised, ridge, solid, sunken)
-padding, -wraplength — задают отступы по краям, и максимальную длину строки в пикселах (после которой следует перенос);

Приукрасим наш первый пример:
image

ttk::entry
Поле для ввода текста

image

Стандартные аргументы:
-textvariable — переменная, в которой будет хранится значение поля
-state — состояние (normal, disabled, readonly)
-justify — выравнивание (left, center, right)

-validate, -validatecommand, -invalidcommand — позволяют использовать проверку введенных данных.

Когда таких виджетов много, удобно для textvariable использовать хеш (например -textvariable => \$UI{login}).

ttk::checkbutton
Кнопка, имеющая несколько состояний. Состояние записывается в -variable.
При нажатии, подобно ttk::button, может вызываться процедура.

image

Аргументы
-text, -textvariable — задают надпись на кнопке
-onvalue, -offvalue — значения, когда опция отмечена или нет. По умолчанию это 1 и 0.
-variable — переменная, в которую записывается значение.
-command — действие, выполняемое при нажатии.

my $checkbutton = $mw->new_ttk__checkbutton(
    -text => 'enable bla-bla feature',
    -variable => \$UI{enable_blabla},
    -command => sub {
        # Обновляем другие виджеты
    },
);


ttk::radiobutton
image

Устройство следующее: каждой radiobutton присваивается уникальное значение (value), которое записывается в переменную (variable)
Когда необходимо объединить, допустим две кнопки в одну группу, то выставляем значения для каждой из них, а -variable будет общей.

my $radiobutton_1 = $mw->new_ttk__radiobutton(-text => 'Option 1', -value => 1, -variable => \$UI{radio});
my $radiobutton_2 = $mw->new_ttk__radiobutton(-text => 'Option 2', -value => 2, -variable => \$UI{radio});


Опции:
-text, -textvariable, -width, -underline, -style итп. Более подробно можете ознакомится в документации по Tcl/Tk

ttk::combobox
Поле для ввода с ниспадающим списком. Когда состояние (state) — readonly, работает только как список.

image

Опции:
-textvariable — переменная, в которой будет хранится значение текстового поля.
-state — состояние (normal, readonly, disabled)
-values — анонимный массив, список.
-postcommand — команда, выполняемая после выбора элемента из списка.
-justify, -height, -width — геометрия виджета.

ttk::frame
Когда на форме много объектов, удобно их группировать с помощью фреймов.
Например
my $frame = $mw->new_ttk__frame();
my $button = $frame->new_ttk_button();

Один фрейм может находиться в другом фрейме и так далее…

Аргументы такие:
-borderwidth, -relief — толщина границы, рельеф flat, groove, raised, ridge, solid, sunken)
-width, -height — длина, ширина
-padding — отступ по краям.

ttk::labelframe
Это тот же самый фрейм, только с заголовком (-text)

image

ttk::progressbar
Прогрессбар, можно выставлять диапазон значений (по умолчанию 0..100)

image

Опции:
-orient — ориентация (horizontal и vertical)
-length — длина в пикселах
-maximum — максимальное значение (100)
-value — текущее значение
-variable — переменная, хранящая значение.

Предыдущие посты:
Работа с меню
Упаковка виджетов
Tkx и потоки

Литература:
Tcl8.5.7/Tk8.5.7 Documentation
Tags:
Hubs:
Total votes 40: ↑34 and ↓6+28
Comments10

Articles