gtk2-perl #1
Linux の GNOME 環境用の GUI を Perl で書きたいと突然思い立って勉強を始めますた。GNOME 環境で GUI をやるときには GTK+ を使う。と言われてもなんのこっちゃという感じなので、自分なりの解釈で説明してみる。
GTK+ とはなんぞや
GNOME 環境で GUI なアプリを作るための ツールキット。Windows プログラミングをしたことがある人なら、MFC や Win32API を想像していただけると大体あってると思う。ウィジェットと呼ばれる部品(ボタンとか)を配置して見た目を作る。GTK+ 自体は C言語のツールキットだが、C++ や python 用のバインディングもある。当然今回は、Perl バインディングを使う。
シグナル駆動プログラミング
メッセージ駆動プログラミングやイベント駆動プログラミングとも言う。通常のプログラミングとは異なり、ウィジェットに対する操作を行い、シグナル受信をトリガとして処理を実行することになる。ちなみにシグナルとは大体こんな感じ。
- マウスがクリックされた
- 規定時間が経過した
- キーが入力された
など、他にもいっぱいあるけど。
GTK+ 自体の説明はこの辺にして、Hello, World!を表示し、ボタンをクリックすると終了する簡単なサンプル。
#!/usr/bin/env perl use strict; use warnings; use utf8; use Gtk2 -init; binmode STDOUT, ':utf8'; &main; sub on_destroy { Gtk2->main_quit; } sub on_clicked { Gtk2->main_quit; } sub main { my $window = Gtk2::Window->new('toplevel'); $window->signal_connect(destroy => \&on_destroy); $window->set_title('初めてのGtk2'); my $vbox = Gtk2::VBox->new(0, 10); $window->add($vbox); my $label = Gtk2::Label->new('Hello, World!'); $vbox->add($label); my $button = Gtk2::Button->new('close'); $button->signal_connect(clicked => \&on_clicked); $vbox->add($button); $window->set_border_width(5); $window->show_all(); Gtk2->main(); }
プログラムを実行するとこんな感じの Window が起動する。×ポンか close ボタンを押すとプログラムが終了する。
簡単にソースコードの説明。
コンテナウィジェット を作成する
my $window = Gtk2::Window->new('toplevel'); $window->signal_connect(destroy => \&on_destroy); $window->set_title('初めてのGtk2');
Gtk2::Window->new で コンテナウィジェット を作るためのオブジェクトを生成し、$window->signal_connect でシグナルのハンドラを設定する。ここでは、コンテナウィジェット が破棄されるシグナルに対してハンドラを設定し、Gtk2->main_quit を呼び出しメインループを終了させている。
パッキングボックスを作成し、ウィジェットを追加する
パッキングボックスとは、ウィジェットを配置するための箱。コンテナウィジェットには一つしかウィジェットを配置できない。複雑な GUI アプリを作成するのに必要になる。垂直パッキングボックスと水平パッキングボックスがある。
my $vbox = Gtk2::VBox->new(0, 10); $window->add($vbox); my $label = Gtk2::Label->new('Hello, World!'); $vbox->add($label); my $button = Gtk2::Button->new('close'); $button->signal_connect(clicked => \&on_clicked); $vbox->add($button); $window->set_border_width(5);
Gtk2::VBox 垂直パッキングボックスのオブジェクトである。$window->add($vbox) でコンテナウィジェットにパッキングボックスを追加している。以下、ラベルとボタンのウィジェットを作成して、パッキングボックスに追加している。
GUIを表示しメッセージループを開始する
$window->show_all();
Gtk2->main();
初回ということで、この辺でおしまいにする。これから勉強をしていく身なので、間違えたことも書いていると思うし、そういったことがあるとご指摘していただけるとありがたいです。作りたいものがあるけど、まずはウィジェットの操作、シグナル駆動のプログラミングに慣れていきたい。学生時代に MFC でツールをいっぱい作ってたので、ある程度は対応できると思うけど、Windows と Linux だと作法も違うと思うしはまる箇所もいっぱい出てくると思う。
会社の仕事も落ち着いて?きたので、勉強日記の更新頻度もがんばって上げていきます。