2010年7月28日 星期三

[PERL]-Gtk2Perl on Windows

最近有個案子是用Perl開發Gtk
因為手頭上沒有Unix like環境
所以必須在windows上架構Gtk2Perl的環境

首先要先安裝ActivePerl這樣才能在windows上編譯及執行Perl
下載位置:ActivePerl
注意,這裡建議安裝ActivePerl 5.8.9.827版本比較穩定,
更新的版本在install ppm上會有些不可預期的問題。


再來利用ppm指令載入Gtk相關的模組
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/ExtUtils-Depends.ppd
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/ExtUtils-PkgConfig.ppd
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/Glib-1080.ppd
ppm install http://gtk2-perl.sourceforge.net/win32/ppm/Gtk2-1080.ppd

ppm install http://gtk2-perl.sourceforge.net/win32/ppm/Gtk2-GladeXML-1.005.ppd

接著要安裝GTK+ Development Enviroment
下載位置:Glade/Gtk+ for Windows
這個安裝檔包含glade3,一個Gtk所見即所得的工具

整個Gtk2Perl的開發環境在此已建構完成
接下來實際拉個畫面來試試看
打開glade3拖拉個畫面如下,並另存新檔檔名為GUI.glade:

接著建個文字檔Gtk2Perl.pl,內容如下
use Glib qw/TRUE FALSE/;
use Gtk2 '-init';
use Gtk2::GladeXML;

my $gladexml = Gtk2::GladeXML->new("GUI.glade");
$gladexml->signal_autoconnect_from_package('main');

my $window = $gladexml->get_widget('window1');
$window->signal_connect( 'delete_event' => sub{Gtk2->main_quit();});
$window->show_all();

Gtk2->main();

由上面的程式碼可知我們就是用Gtk2::GladeXML這個模組來載入glade編寫出來的.glade檔,
接著直接點擊Gtk2Perl.pl就可以看到執行畫面:

注意,如果執行期發生如下的error
Can't locate object method "signal_connect" via package "Gtk2::Window"
請找出Gtk2.pm檔案,在開頭加上push @Gtk2::Object::ISA, 'Glib::Object';這行即可

最後簡單介紹兩個元件的使用心得
Gtk2::ComboBox,下面的程式碼(非完整)
利用Gtk2::ListStore來做為combobox model的資料來源,
使用Gtk2::CellRendererText來呈現Combobox的欄位,
$FFComboBox->add_attribute ($fy_renderer, "text", ID_COLUMN);
表示render由model的ID_COLUMN欄位取得"text"文字資料
$fy_model = Gtk2::ListStore->new('Glib::String');
foreach (reverse(keys(%fy_all))) {
$fy_model->set($fy_model->append, ID_COLUMN, $_);
}
$FFComboBox->clear();
$FFComboBox->set_model($fy_model);
$fy_renderer = Gtk2::CellRendererText->new;
$FFComboBox->pack_start ($fy_renderer, false);
$FFComboBox->add_attribute ($fy_renderer, "text", ID_COLUMN);
if ($FFComboBox->get_active() == -1) {
$FFComboBox->set_active(0);
}


Gtk2::Dialog,下面是說明一般是如何接受Dialog(與繼承Dialog的模組)的回傳動作,
$config_dialog->set_response_sensitive (0, FALSE);
是說將0註冊為這個dialog的response_id,
然後$config_dialog->run()時會等待該dialog有所動作,並回傳該動作的response_id,
至於dialog的動作就是由button元件觸發,所以button元件會有一個response_id屬性,
用來註明該button動作時會回傳的response_id值,
最後就是利用if (0 eq $config_dialog->run())來判斷按下的是dialog中的那一個按鈕
my $config_dialog = shift @_;
my $text_view = shift @_;

$config_dialog->set_response_sensitive (0, FALSE);
$config_dialog->show();
if (0 eq $config_dialog->run()){
$config_dialog->hide();
}

參考文件:

沒有留言:

張貼留言