使用 Gtk2-Perl 程式設計/入門/快速說明
在執行此指令碼或閱讀下面的解釋之前,請通讀程式並嘗試理解它在做什麼。在你認為自己弄明白後,嘗試執行它。當你按下 Alt+s 或 Alt+x 時會發生什麼?當你改變視窗大小的時候你注意到什麼了嗎?
use warnings;
use strict;
use Glib qw(TRUE FALSE);
use Gtk2 '-init';
my $window = Gtk2::Window->new;
$window->set_title('Quick Note');
$window->signal_connect('delete-event' => sub { $_[0]->destroy });
$window->signal_connect('destroy' => sub { Gtk2->main_quit });
my $hbox = Gtk2::HBox->new;
my $label = Gtk2::Label->new('Note');
my $entry = Gtk2::Entry->new();
my $save_btn = Gtk2::Button->new_with_mnemonic('_Save');
$save_btn->signal_connect('clicked' => \&save_note, $entry);
my $exit_btn = Gtk2::Button->new_with_mnemonic('E_xit');
$exit_btn->signal_connect('clicked' => sub { $window->destroy });
$hbox->pack_start($label , FALSE, FALSE, 0);
$hbox->pack_start($entry , TRUE , TRUE , 0);
$hbox->pack_start($save_btn, FALSE, FALSE, 0);
$hbox->pack_start($exit_btn, FALSE, FALSE, 0);
$window->add($hbox);
$window->show_all;
Gtk2->main;
sub save_note {
my $save = shift;
my $entry = shift;
my $text = $entry->get_text;
$entry->set_text('');
open my $OUTFILE, '>>notes.txt'
or die "could not open notes.txt for appending";
flock $OUTFILE, 2;
print $OUTFILE join '|', time, $text . "\n";
close $OUTFILE;
}
在這個指令碼中,我們介紹了一些新的視窗部件。HBox 是一個容器視窗部件,我們用它來控制視窗中其他視窗部件的佈局。另外兩個是 Entry 和 Button 視窗部件,它們允許使用者與程式互動。
use Glib qw(TRUE FALSE);
Glib 是 Gtk 的一個依賴項。我們在程式中包含這一行是為了獲取對常量 TRUE 和 FALSE 的訪問許可權。你可以簡單地使用布林值 1 和 0,但為了清晰起見,我們將使用 TRUE 和 FALSE。
$window->signal_connect('delete-event' => sub { $_[0]->destroy });
$window->signal_connect('destroy' => sub { Gtk2->main_quit });
你可以看到,我們在繫結到訊號/事件時採用了略微不同的方法。在這裡,我們在 'delete-event' 發生時呼叫視窗的 destroy 方法(它會發出 'destroy' 訊號)。連線到 'destroy' 訊號,我們有指示在 Gtk 的主迴圈中退出執行的指令。使用這種方法是因為我們希望程式在應用程式視窗以任何方式銷燬時退出,而不僅僅是在使用者按下視窗標題欄中的關閉按鈕時退出。稍後,我們將連線到 $exit_btn 的 'clicked' 訊號,以銷燬視窗,從而退出應用程式。
儘管使用相同的方法進行連線,但事件和訊號之間確實存在區別(這些訊號與 Unix 系統訊號不同,也不使用它們來實現,但術語非常相似)。後面會對此進行更多介紹。
my $save_btn = Gtk2::Button->new_with_mnemonic('_Save');
這將建立一個新的 Button 視窗部件,它有標籤 'Save'。請注意,我們在這裡使用了 'new_with_mnemonic' 方法。這將設定鍵盤快捷鍵 Alt+s 來觸發按鈕上的 'clicked' 事件。'Save' 中的 'S' 也將被下劃線,以提醒終端使用者鍵盤快捷鍵的存在。
因為我們正在使用 Perl 繫結,所以我們可以簡單地說
my $save_btn = Gtk2::Button->new('_Save');
這是因為 Perl 繫結意識到我們實際上想要使用底層 C 庫中提供的 'new_with_mnemonic' 建構函式。其他也具有 'new_with_mnemonic' 或 'new_with_label' 建構函式的視窗部件通常也允許你這樣做。許多人仍然更喜歡使用 'new_with_label' 或 'new_with_mnemonic' 建構函式,無論如何。
$save_btn->signal_connect('clicked' => \&save_note, $entry)
在這裡,我們使用子程式的引用而不是匿名的子程式。$entry 將在回撥執行時作為引數傳遞。
my $exit_btn = Gtk2::Button->new_with_mnemonic('E_xit');
$exit_btn->signal_connect('clicked' => sub { $window->destroy });
現在你應該清楚這兩行程式碼的作用了。
$hbox->pack_start($label , FALSE, FALSE, 0);
$hbox->pack_start($entry , TRUE , TRUE , 0);
$hbox->pack_start($save_btn, FALSE, FALSE, 0);
$hbox->pack_start($exit_btn, FALSE, FALSE, 0);
這兩行程式碼將我們的介面視窗部件打包到 HBox 視窗部件中。語法是
$container->pack_start($widget, $expand, $fill, $padding)
如果 $expand 引數為 FALSE,則容器將收縮到視窗部件周圍。如果 $expand 引數為 TRUE,則容器將在視窗部件周圍擴充套件,以填充其父級分配的空間。當 $fill 引數為 TRUE 時,容器內的額外空間將分配給子視窗部件。當設定為 FALSE 時,額外空間將作為容器視窗部件的填充保留。只有當 $expand 引數也為 TRUE 時,$fill 引數才會生效。
在我們的示例中,$entry 物件被打包,$expand 和 $fill 引數設定為 TRUE。當你改變視窗大小時,$entry 周圍的框會擴充套件,使 $entry 填充剩餘區域。其他物件,它們被打包的 $expand 和 $fill 值為 FALSE,將保持其自然大小。
sub save_note {
my $save = shift;
my $entry = shift;
my $text = $entry->get_text;
$entry->set_text('');
open my $OUTFILE, '>>notes.txt'
or die "could not open notes.txt for appending";
flock $OUTFILE, 2;
print $OUTFILE join '|', time, $text . "\n";
close $OUTFILE;
}
如果你不清楚這裡發生了什麼,建議你瀏覽一下 Perl 程式設計。