RGtk2基本編

DFBrowserを作るためにRGtk2の情報をいろいろ探したわけですが,日本語の情報は皆無といっていいです。自分のためのメモと,後続で誰か面白いものを作ってくれることを期待して,得た情報をまとめようと思います。

まず,GtkそのものはC言語前提ですが,Ruby-GNOME2やPyGTK等の他言語用バインディングも作られています。RGtk2もその仲間です。Gtk本体やRuby-GNOME2,PyGTKは日本語情報も豊富なのでそれらを参考にしながらやるのがいいと思います。

http://mikeforce.net/documents/gtk+-2.8.x-refs/gtk/html/index.html
http://mikeforce.net/documents/gtk+-2.0.x-tut/html/gtk-tut.html

やや古いものもありますが,Gtk2.x系ならだいたい同じです。Gtk1.x系は互換性がないので気をつけてください。Rのヘルプも英語ですがけっこう充実しています。ただ,未完の部分もかなりあります。ヘルプの末尾にGtkのリファレンスへのリンクがあるので,欠けているところはそちらで補えばいいと思います。ここではチュートリアル的に実動コードをガンガン載せていく方向でいきます。

必要なもの

最低限のオブジェクト指向の知識が必要です。ほんとに最低限で大丈夫です。僕も最低限しかしらないので…。クラス・オブジェクトの概念,クラスの継承,多相性ぐらいを知ってれば問題ないと思います。なくても意外と大丈夫かもしれません。

本題

では簡単なものから。

f:id:phosphor_m:20100211222431p:image:right

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
gtkWindowSetTitle(win, "Test")
gtkContainerAdd(win, lab)

見たまんまです。gtkWindowNew()はGtkWindowクラスのオブジェクトを作ります。gtkLabelNew()も同じことです。ここでは"Hello, world!"という初期値を与えています。GtkWindowはWindowです。GtkLabelは文字だけのwidgetです。Gtkではwidgetとobjectがあって,widgetは目に見える部品,objectはそれ以外の目に見えないものです。ただ,実際にはwidgetもobjectに含まれます。gtkWindowSetTitle()はGtkWindowクラスのメソッドで,タイトルを設定します。そのまんまですね。gtkContainerAdd()はGtkContainerクラスのメソッドなわけですが,GtkWindowクラスはGtkContainerクラスを継承しているので,GtkWindowクラスのオブジェクトに対しても用いることができます。GtkWindowの継承関係は以下のようになっています。

GObject
   +----GInitiallyUnowned
         +----GtkObject
               +----GtkWidget
                     +----GtkContainer
                           +----GtkBin
                                 +----GtkWindow
                                       +----GtkDialog
                                       +----GtkAssistant
                                       +----GtkPlug

これはhelp(GtkWindow)に載ってます。RGtk2ではクラスのヘルプも用意されているのでとても便利です。

ところで,RGtk2ではオブジェクト指向的な記法が用意されています。

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
win$SetTitle("Test")
win$Add(lab)

オブジェクトにメソッドを適用してるって感じが出てます。$を.に変えるとRubyっぽいですね。R的にはなんか変な感じですが。こんな感じで,オブジェクト+$+メソッド(...)という書き方ができます。クラス名を省略できるのでメソッドがどの上位クラスのメソッドだったか悩まずに済みます。

さらに親切なことにキャメルケースでも書けます。

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew()
win$setTitle("Test")
win$add(lab)

お好みでどうぞ。

RGtk2の記法で特徴的なものがもうひとつあります。

lab <- gtkLabelNew("Hello, world!")
win <- gtkWindowNew(show=FALSE)
win["default-width"]  <- 100
win["default-height"] <- 50
win["title"]          <- "Test"
win$add(lab)
win$showAll()

コードが何を意味してるのかはこれも見たままで幅と高さを設定してるだけです。これらはGtkではオブジェクトのPropertyと位置づけられています。Propertyの閲覧,編集はwin["default-width"]のようにvectorの要素へのアクセスっぽく書けます。Propertyと後々説明するSignalはRGtk2のヘルプでは欠けてることが多いです。ただ,この二つはGtkでもRGtk2でも同じなのでGtkのリファレンスをみればわかります。例えば,GtkWindowのPropertyは以下にあります。

http://library.gnome.org/devel/gtk/unstable/GtkWindow.html#GtkWindow.properties

gbooleanにはTRUE,FALSEを,gintにはintegerを,gcharにはcharacterを放り込めばうまいこと取り計らってくれます。あと,win["title"]とwin$setTitle()のようにメソッドとPropertyで機能的にかぶってるものもありますが,たぶん好きなほうを使ってればいいと思います。幅,高さの設定にもgtkWindowSetDefaultSize()というメソッドがあります。

あとwin <- gtkWindowNew(show=FALSE)とwin$showAll()を説明してませんでした。gtkWindowNew()は走らせると同時にwindowが出現します。これだと,起動中に少しずつ部品が増えていく感じになって,それはそれで面白いですが,どちらかというと醜いです。それに,いちど表示してしまうとdefault-width,default-heightがあとからは設定できなかったりします。gtkWindowNew(show=FALSE)のように非表示で作成して,最後にwin$showAll()でまとめて表示するのが一般的なようです。