The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Каталог документации / Раздел "Perl" / Оглавление документа
Создание кнопок

Иерархия наследования

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;
}

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




Спонсоры:
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2020 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру