Создание кнопок

Иерархия наследования Inheritance Hierarchy Object +--- Widget +--- Container +--- Bin +--- Button

Есть два пути создания кнопок, создать пустую кнопку и добавить потомка позднее или создать кнопку с лейблом как потомка: $button = new Gtk::Button(); $button = new Gtk::Button( $label ); $button = new_with_label Gtk::Button( $label );

Первая функция создает пустую кнопку, две послдение создают её с лейблами. Средная просто сокращение последней. Если создается кнопка с лейблом, то можно использовать button->child для доступа к виджету-потомку. Например, чтобы изменить текст в на лейбле, нужно сделать так: $button->child->set( "new label" );

Если кнопка с лейблом не создается, то необходимо виджет добавить к кнопке. Например три следующих примера эквивалентны: # создать кнопку с лейблом $button = new Gtk::Button( "text" ); # тоже самое, но с другой функцией new() $button = new_with_label Gtk::Button( "text" ); # создать лейбл, отделенный от кнопки и объединить их потом вручную. $button = new Gtk::Button(); $label = new Gtk::Label( "text" ); $button->add( $label );

Сигналы, посылаемые кнопками.

Виждет кнопки посылает следующие сигналы:

'pressed' - посылается, когда кнопка нажата в пределах её размеров, или когда происходит вызов функции $button->pressed()

'released' - посылается, когда когда кнопка отжата в пределах её размеров, или когда происходит вызов функции $button->released()

'clicked' - когда кнопка нажата и отпущена в пределах размеров или когда вызывается функция $button->clicked()

'enter' - когда курсор мыши входит в пределы кнопки или когда вызывается функция $button->enter()

'leave' - когда курсор выходит из области, где нарисвана кнопка, соответственно эмитация выхода, как и выше, может быть вызвана програмно $button->leave()

Стили

Стили кнопок могут быть трех типов: 'normal', 'half' и 'none'. 'normal' - по умолчанию, для утсановки и апроса стиля, нужно писать следующее: $button->set_relief( $relief_style ); $button->get_relief();

Ниже пример, в котором создается кнопка с лейблом, который в дальнейшем изменяется, далее удаляется и переопределяется вручную и в конце по третьему клику происходит выход из формы с кнопкой. #!/usr/bin/perl -w use Gtk; use strict; set_locale Gtk; init Gtk; my $false = 0; my $true = 1; my $window = new Gtk::Window( "toplevel" ); my $button = new Gtk::Button( "Button created with label" ); my $label; my $id; my $numclicked = 0; # обработка выхода $window->signal_connect( "delete_event", \&CloseWindowEvent ); $button->signal_connect( "clicked", \&ClickedButtonEvent ); # атрибуты $button->show(); # атрибуты окна $window->border_width( 15 ); $window->add( $button ); $window->show(); # вызов Gtk main Gtk; exit( 0 ); ### Подпрограммы # вызов когда кнопка кликнется, при первом нажатии лейбл изменяется, при втором нажатии лейбл добавляется к кнопке, при # третьем нажатии лейбл меняется и пи четвертом происходит выход из программы sub ClickedButtonEvent{ if ( $numclicked == 0 ){ $button->child->set( "Changed Button Label" ); $numclicked++; } elsif ( $numclicked == 1 ){ $window->remove( $button ); $button = new Gtk::Button(); $label = new Gtk::Label( "Label added to a button" ); $button->add( $label ); $label->show(); $button->show(); $window->add( $button ); $id = $button->signal_connect( "clicked", \&ClickedButtonEvent ); $numclicked++; } elsif ( $numclicked == 2 ) { $label->set( "Now Click to Close Window" ); $numclicked++; } else { Gtk->exit( 0 ); } } # Callback called when the window is asked to close. What really # happens is that the window moves down and to the right. This is an # excellent example of a program that doesn't act like the user # expects. sub CloseWindowEvent { # If you return a false value in the "delete_event" signal # handler, GTK will emit the "delete_event" signal. # Returning a true value means you don't want the window to # be destroyed. $window->window->move( 100, 100 ); return $true; }

сделать скриншоты работы программы