Aplikacje okienkowe napisane przy pomocy biblioteki Perl/Tk to rozwiązanie dające całkiem duże możliwości. Chciałbym pokazać kilka sztuczek, których sposób realizacji może łatwo umknąć w natłoku rozmaitej dokumentacji. Poniższe przykładowe fragmenty kodu odnoszą się do następującego skryptu szkieletowego:
#!/usr/bin/perl
use Tk;
use strict;
use warnings;
my $Win = MainWindow->new (
-title => 'Testowe okienko'
);
# dodatkowe ustawienia koniecznie przed MainLoop
MainLoop;
1. Blokowanie zmiany rozmiaru okna
Aby pozbawić naszą aplikację (lub jedno z jej okien) możliwości zmiany rozmiaru okna, musimy podpiąć do zdarzenia
<Configure> tzw. callback - czyli de facto obsługę zdarzenia. W callbacku spowodujemy, że mimo działań użytkownika podejmującego próbę zmiany rozmiaru, początkowe rozmiary okna zostaną natychmiast przywrócone:
$Win->bind('<Configure>' => sub {
my $event = $Win->XEvent;
$Win->maxsize($event->w, $event->h);
$Win->minsize($event->w, $event->h);
});
A propos, sztywne zdefiniowanie rozmiarów okna może być osiągnięte w taki sposób:
$Win->minsize(qw(700 525));
gdzie 700 to oczywiście szerokość, a 525 - wysokość.
2. Obsługa zamknięcia okna
Na analogicznej zasadzie jak w przykładzie powyżej możemy zablokować zamknięcie okienka przez przycisk [x] z prawego górnego rogu okna. Wymaga to użycia metody
protocol:
$Win->protocol('WM_DELETE_WINDOW' => sub {});
W momencie zastosowania powyższej konstrukcji aplikacja może zostać pozbawiona podstawowej funkcjonalności - czyli możliwości jej zamknięcia. Dlatego warto przekierować obsługę zdarzenia protokołu managera okien
WM_DELETE_WINDOW na nie-pustą metodę, w której np. wyświetlony zostanie komunikat z odpowiednim pytaniem, nastąpią określone czynności typu zalogowanie zdarzenia zamknięcia aplikacji itd. W sytuacji wyświetlenia pytania potwierdzającego chęć zamknięcia oka (wyjścia z aplikacji), przykładowy kod wygląda następująco:
sub ExitApp {
my $response = $Win->messageBox(
-icon => 'question',
-message => 'Zamknac okno?',
-title => 'Pytanie',
-type => 'YesNo',
-default => 'No');
# zaniechanie jeśli 'Nie'
return if $response eq 'No';
exit;
}
$Win->protocol('WM_DELETE_WINDOW' => \&ExitApp);
3. Skróty klawiszowe
Każda porządna aplikacją powinna obsługiwać skróty klawiszowe. Perk/Tk oczywiście umożliwia wprowadzanie takiej funkcjonalności. Aby przykładowy skrót CTRL-X spowodował takie samo działania, jak wybranie przycisku [x] (zakładając zastosowanie kodu z poprzedniego punktu), wystarczy podpiąć pod określone widget event funkcję
ExitApp:
$Win->bind('<Control-x>' => \&ExitApp);