Иерархия наследования
Object
+--- Widget
+--- Container
+--- Box
+--- ButtonBox
Бокс с кнопками предназначен для удобства расположения последних. Можно располагать серии кнопок как вертикально, так и горизонтально. Для создания необходимого button box нужно написать
$button_box = new Gtk::HButtonBox();
$button_box = new Gtk::VButtonBox();
Так-же этот метод расположения позволяет задавать и изменять величину пробела между кнопками:
$button_box-> set_spacing_default ($spacing);
$button_box-> get_spacing_default ();
И, помимо всего прочего, можно задавать тип расположения кнопок внутри бокса:
$button_box-> set_layout_default ($layout);
Переменная $layout может иметь несколько значений:
'default_style'
'spread'
'edge'
'start'
'end'
Текущее состояние лайота может быть восстановлено функцией
$button_box-> get_layout_default ();
Добавление кнопок в бокс можно реализовать, написав функцию
$button_box->add( $button );
И небольшой пример, иллюстрирующий все типы лайотов, определяющих поведение содержимого button box:
#!/usr/bin/perl -w
use Gtk;
use strict;
set_locale Gtk;
init Gtk;
my $false = 0;
my $true = 1;
my $window;
my $main_vbox;
my $vbox;
my $hbox;
my $frame_horizontal;
my $frame_vertical;
# создаем окно
$window = new Gtk::Window( "toplevel" );
$window->set_title( "Button Boxes" );
$window->signal_connect( "destroy", sub { Gtk->exit( 0 ); } );
$window->border_width( 10 );
# Создаем вертикальный бокс
$main_vbox = new Gtk::VBox( $false, 0 );
$window->add( $main_vbox );
# создаем горизонтальный фрейм
$frame_horizontal = new Gtk::Frame( "Horizontal Button Boxes" );
$main_vbox->pack_start( $frame_horizontal, $true, $true, 10 );
# Создаем вертикальный бокс, чтобы внутри поместить горизонтальный фрейм
$vbox = new Gtk::VBox( $false, 0 );
$vbox->border_width( 10 );
$frame_horizontal->add( $vbox );
$vbox->pack_start( create_bbox( $true, "Spread (spacing 30)",
30, 85, 20, 'spread' ),
$true, $true, 0 );
$vbox->pack_start( create_bbox( $true, "Spread (spacing 40)",
40, 85, 20, 'spread' ),
$true, $true, 0 );
$vbox->pack_start( create_bbox( $true, "Edge (spacing 30)",
30, 85, 20, 'edge' ),
$true, $true, 5 );
$vbox->pack_start( create_bbox( $true, "Start (spacing 20)",
20, 85, 20, 'start' ),
$true, $true, 5 );
$vbox->pack_start( create_bbox( $true, "End (spacing 10)",
10, 85, 20, 'end' ),
$true, $true, 5 );
# создаем вертикальный фрейм
$frame_vertical = new Gtk::Frame( "Vertical Button Boxes" );
$main_vbox->pack_start( $frame_vertical, $true, $true, 10 );
# создаем горизонтальный бокс, чтобы поставить туда вертикальный фрейм
$hbox = new Gtk::HBox( $false, 0 );
$hbox->border_width( 10 );
$frame_vertical->add( $hbox );
$hbox->pack_start( create_bbox( $false, "Spread (spacing 5)",
5, 85, 20, 'spread' ),
$true, $true, 0 );
$hbox->pack_start( create_bbox( $false, "Edge (spacing 30)",
30, 85, 20, 'edge' ),
$true, $true, 5 );
$hbox->pack_start( create_bbox( $false, "Start (spacing 20)",
20, 85, 20, 'start' ),
$true, $true, 5 );
$hbox->pack_start( create_bbox( $false, "End (spacing 20)",
20, 85, 20, 'end' ),
$true, $true, 5 );
$window->show_all();
main Gtk;
exit( 0 );
### подпрограммы
# Создаем бокс с параметрами. Первый параметр ложь или истина,
# отвечает за ориентацию бокса, второй - заголовок бокса.
# третий - величина отступа, четвертый и пятый - высота и ширина кнопок
# и шестой - параметр выравнивания внутри кнопок.
sub create_bbox{
my ( $horizontal, $title, $spacing, $child_w, $child_h, $layout ) = @_;
my $frame;
my $bbox;
my $button;
$frame = new Gtk::Frame( $title );
# создаем баттон бокс
if ( $horizontal )
{
$bbox = new Gtk::HButtonBox();
}
else
{
$bbox = new Gtk::VButtonBox();
}
$bbox->border_width( 5 );
$frame->add( $bbox );
# Устанавливаем набор параметров
$bbox->set_layout( $layout );
$bbox->set_spacing( $spacing );
$bbox->set_child_size( $child_w, $child_h );
# добавляем кнопки в бокс
$button = new Gtk::Button( "OK" );
$bbox->add( $button );
$button = new Gtk::Button( "Cancel" );
$bbox->add( $button );
$button = new Gtk::Button( "Help" );
$bbox->add( $button );
return ( $frame );
}