Иерархия наследования
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;
}
сделать скриншоты работы программы