amari3のはてなダイアリー このページをアンテナに追加 RSSフィード

2011-10-11

[][]gtk2-perl #3 イメージビューアにメニューバーとファイルを開くダイアログを追加してみた

前回作ったイメージビューアにメニューバーとファイルを開くダイアログを追加して、アプリ開発をしやすい様に、簡単にクラス化してみた。

ソースはこんな感じ。

メニューバーはXMLで構造を定義して、それに対応する、コマンドやハンドラを登録するという感じです。そんなに難しいところはないんですが、情報が少ないので自分用のメモとして置いておこうかと。

実行するとこんな感じ。

f:id:amari3:20111011233158p:image

前回との違いは、メニューバーが追加されたのと、Quitボタンを削除して、メニューに入れたくらい。

2011-10-01

[][]gtk2-perl #2 イメージビューアを作ってみた

入門GTK+の第2章の画像ビューアを Perl で作ってみた。前回から相当期間があいているが、またちょくちょくやっていこうと思う。

入門GTK+

入門GTK+

ソースはこんな感じ。

実行すると以下の様な Window が起動する。

f:id:amari3:20111002010346p:image

LinuxGUI アプリに興味があるので、少しずつではあるが勉強していこうと思う。

2010-10-11

[][]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 ボタンを押すとプログラムが終了する。

f:id:amari3:20101011134626p:image

簡単にソースコードの説明。

コンテナウィジェット を作成する

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 だと作法も違うと思うしはまる箇所もいっぱい出てくると思う。

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