Графический дизайн интерфейса основан на обработке событий. Для правильной работы важно зарезервировать поток для обработки пользовательских событий (клавиатура, щелчки мыши ...). Это цель вызова Gtk2->main()
, когда пользовательский интерфейс готов принять взаимодействие с пользователем.
Чтобы поток событий вышел из цикла событий, метод обратного вызова может вызвать Gtk2->main_quit()
Gtk2::Builder
создает иерархию виджетов Gtk из XML. Чтобы получить несколько экземпляров одного и того же окна, вы должны создать конструктор для каждого из них.
Тогда ваши методы обратного вызова события должны получить информацию о том, какое окно отправило событие, и для этой цели можно использовать параметр $user_data
.
Вот кодовое предложение с простым обратным вызовом нажатия кнопки, которое использует Perl-ссылку на хеш, чтобы вы могли передавать столько информации, сколько вам нужно, между кодом создателя окна и обратными вызовами событий:
sub createWindow($)
my $windowTitle = $_[0];
my $windowBuilder = Gtk2::Builder->new();
$windowBuilder->add_from_file($glade_file);
my $window = $windowBuilder->get_object('window1');
my $hp_cur = $windowBuilder->get_object('HP_Cur');
# Create hash with data (alternative: use Class::Struct for better code)
my %window_user_data = {
"title" => $windowTitle,
"window" => $window,
"hp_cur" => $hp_cur };
# Pass hash reference as user data
$windowBuilder->connect_signals(\%window_user_data);
# prepare interface: set data model into view and then...
$window->show();
}
# Click callback method defined on a button in window
sub button_click_callback($$) {
my $button = $_[0];
my $window_user_data_ref = $_[1];
# get back data model from view
print "Click received from button on "
. $window_user_data_ref->{"title"} . "\n";
}
Существует еще один способ обработки обратных вызовов для каждого окна, но он требует больше навыков Perl: вы можете создать пакет Perl для создания экземпляра объекта для определенного окна и использовать $windowbuilder->connect_signals ($user_data, $windowcallbackinstance)
. В этом случае такой объект называется контроллером, и вы построили графический интерфейс на основе шаблона Model-View-Controller (MVC) .