gtk2-perl #1

LinuxGNOME 環境用の GUIPerl で書きたいと突然思い立って勉強を始めますた。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 でツールをいっぱい作ってたので、ある程度は対応できると思うけど、WindowsLinux だと作法も違うと思うしはまる箇所もいっぱい出てくると思う。

会社の仕事も落ち着いて?きたので、勉強日記の更新頻度もがんばって上げていきます。