Ruby GTK2

目次

コンテナ

前ページで述べた通り,別のウィジェットを収納可能なウィジェットをコンテナという.本ページではコンテナについてもっと詳しく説明する.

コンテナは大きく2種類に分類できる.

前述の1つ目のコンテナにはGtk::Binを継承したクラスで,ウィンドウや「さまざまなウィジェット」で紹介するようなボタンやフレームウィジェットなどがある.そして2つ目のコンテナには以下のようなものがある. これらのコンテナは単体では表示状態であっても何も見えない.しかし,他のウィジェットと組み合わせることで,外観を形成するのに大きく貢献する.本ページでは,これらのコンテナについて紹介する.

パッキングボックス

パッキングボックスとはGtk::Boxを継承したクラスらのこと.パッキングボックスには次の2つがある.

クラスGtk::HBoxGtk::VBox
コンテナ横方向にパッキングしていくコンテナ縦方向にパッキングしていくコンテナ
コード
#!/usr/bin/ruby

require 'gtk2'

win = Gtk::Window.new()

hbox = Gtk::HBox.new(false, 10)
lbl1 = Gtk::Label.new("hoge")
lbl2 = Gtk::Label.new("fuga")
lbl3 = Gtk::Label.new("piyo")
hbox.pack_start(lbl1)
hbox.pack_start(lbl2)
hbox.pack_start(lbl3)

win.add(hbox)
win.show_all()
Gtk.main()
#!/usr/bin/ruby

require 'gtk2'

win = Gtk::Window.new()

vbox = Gtk::VBox.new(false, 10)
lbl1 = Gtk::Label.new("hoge")
lbl2 = Gtk::Label.new("fuga")
lbl3 = Gtk::Label.new("piyo")
vbox.pack_start(lbl1)
vbox.pack_start(lbl2)
vbox.pack_start(lbl3)

win.add(vbox)
win.show_all()
Gtk.main()
実行画面

パッキングボックスのコンストラクタは,第1引数で子ウィジェットのサイズを均一にするかを,第2引数で子ウィジェット間の隙間の長さ(ピクセル)を指定する.

複数のウィジェットを収納可能なコンテナは,複雑なレイアウトに対応したパッキング関数を持つ.pack_start関数はその中の一つであり,Gtk::VBoxは下に,Gtk::HBoxは右に指定したウィジェットを追加する.このようなコンテナのパッキング関数の詳細は,で詳しく説明する.

テーブル

テーブルは行と列を持つ,複数のウィジェットを収納可能なコンテナである.テーブルのパッキング関数は,行の開始位置と終了位置,列の開始位置と終了位置を指定してウィジェットを収納する.例えば列数が4と行数が3のテーブルは,次のような番号で位置を指す.

3つのウィジェットを図で表した色の場所ごとに収納したサンプルコードを以下に示す.ここで,テーブル(Gtk::Table)のパッキングにはattach_default関数を使用する. attach_default関数の引数はそれぞれ順番に,収納するウィジェット,列の開始位置,列の終了位置,行の開始位置,行の終了位置である.
#!/usr/bin/ruby

require 'gtk2'

win = Gtk::Window.new()

tbl = Gtk::Table.new(4, 3,true) # 列4✕行3のテーブル.
lbl1 = Gtk::Label.new("hoge")
lbl2 = Gtk::Label.new("fuga")
lbl3 = Gtk::Label.new("piyo")
tbl.attach_defaults(lbl1, 0, 1, 0, 3)
tbl.attach_defaults(lbl2, 1, 4, 0, 1 )
tbl.attach_defaults(lbl3, 1, 4, 1, 3)

win.add(tbl)
win.show_all()
Gtk.main()
このプログラムの実行結果は次の通りである.

パッキング

複数のウィジェットを収納可能なコンテナには,add関数以外に複雑なレイアウトに対応するためのパッキング関数がある.各コンテナで使用するパッキングとアンパッキングには次のような関数がある.

ウィジェットパッキングアンパッキング
1つのウィジェットを収納可能 Gtk::Container.add Gtk::Container.remove
複数のウィジェットを収納可能
  • Gtk::HBox
  • Gtk::VBox
  • Gtk::Box.pack_start
  • Gtk::Box.pack_end
Gtk::Table
  • Gtk::Table.attach
  • Gtk::Table.attach_defaults
Gtk::Box.pack_start(child_widget, expand=true, fill=true, padding=0)
Gtk::Box.pack_end(child_widget, expand=true, fill=true, padding=0)
ウィジェット(child_widget)を決められた位置に収納.パッキングボックス(Gtk::Box)では,Gtk::Boxのpack_startとpack_end,そしてGtk::Containerのaddで配置する位置が異なる(後述の理由によりaddはpack_startと同じである).各関数は,ウィジェットを端の方に配置していく.配置位置は次の表で書かれた端である.
関数VBoxHBox
pack_start
add
pack_end
expand
trueの場合,子ウィジェットの大きさが拡大可能な時拡大する.
fill
expandの値とこの変数がtrueの場合,かつ内側のウィジェットに隙間があれば,そこを埋めるように拡大する.
padding
追加するウィジェットと,内側のウィジェットとの間の隙間を設定.
Gtk::Table.attach(child, left, right, top, bottom, xopt=Gtk::EXPAND|Gtk::FILL, yopt=Gtk::EXPAND|Gtk::FILL, xpad=0, ypad=0)
Gtk::Table.attach_defaults(child, left, right, top, bottom)
指定したウィジェットを(child)をテーブルに収納する.ウィジェットは,X軸のleftからright,Y軸のtopからbottomの位置に収納される.テーブルでもadd関数は使用可能だが,add関数では座標を指定できない.
xopt
yopt
xoptはX軸の,yoptはY軸に関するウィジェットのサイズに関するオプション.オプションの型と定数は次の通りである.
GtkAttachOptions
Gtk::EXPAND
スペースを埋めるようにウィジェットを拡大しようとする.1<<0の値.
Gtk::FILL
ウィジェットのために用意された領域を埋めるよう拡大しようとする.1<<1の値.
Gtk::SHRINK
可能であればウィジェットを縮小する.1<<2の値.
オプションはビット列で表される.例えばGtk::EXPAND|Gtk::FILLは0b011の時と等しい.
xpad
ypad
xpadはX軸の,ypadはY軸のウィジェット間の隙間を指定.
attach_defaults関数は,attach関数を扱いやすくしたものである.
Gtk::Container.add(widget, child_perperties=nil)

add関数

複数のウィジェットを収納可能なコンテナでadd関数を呼んだ場合,1つのウィジェットを収納可能なコンテナ(Gtk::Binを継承したコンテナ)のadd関数とは異なる関数を呼び出す.Gtk::Boxの場合はpack_start関数,Gtk::Tableの場合はattach関数が呼び出される.この時使用される引数は,必ずしも正しいものとは限らない.

コンストラクタ

Gtk::Box.new(homogeneous=false, spacing=0)
homogeneous
子ウィジェットのサイズを均一にするか.
spacing
子ウィジェット間の隙間の長さ.
前述の2つの値は,それぞれset_homogeneousやset_spacingの関数を使用して設定可能である.
Gtk::Table.new(rows, columns, homogeneous=false)
rows
列数
columns
行数