Frame を使ったレイアウト

■ フレームウィジェット

grid を工夫すればある程度見栄えの良い配置ができますが,やはり限界があります.例えば,「この一列だけ他のボタンと独立にpackで配置したい」といった場合は,gridだけではできません.

そのような時には,Frameウィジェットを使い,メインウィンドウをいくつかの枠(フレーム)に区切り,各フレーム毎に配置していけば良いのです.

書式: $child = $parent->Frame(?options?)

主なオプション:

オプション 説明 オプション値の例
-height => h フレームのX方向の幅 12, 24
-width => w フレームのY方向の幅 12, 24
-relief => style フレームのスタイル 'raised', 'groove', 'ridge', 'solid', 'sunken', 'flat'
-borderwidth => amount フレーム境界の幅 2,4

補足:
Frameではオプションを使うことはあまりありません.通常は,

$fra = $mw->Frame();

形でいくつかのフレームを作り,packやgridなどで大まかに配置し,各フレームの毎に新しいウィジェットを

$but_in_fra = $fra->Button();

のように,定義していきます.-reliefを指定すると,枠を陽に表示させることができます.

フレームは入れ子にすることが出来るので,さらに難しいレイアウトをするには使ってみると良いでしょう.


#!/usr/bin/perl -w
use Tk;

$mw = MainWindow->new;

for $side (qw/left right/) {
    $$side = $mw->Frame(-relief=>'groove')
          ->pack(-side=>$side);
}
## 左側のフレーム
$left->Label(-image=> $mw->Photo(-file=>'Xcamel.gif'))
    ->pack();
$left->Button(-text=>"こっちはpack")
    ->pack();

## 右側のフレーム
for ($i=0; $i<3; $i++) {
  for ($j=0; $j<4; $j++) {
     $right->Button(-text=>"($i$j)")
        ->grid(-row=>$i, -column=>$j);
  }
}
$right->Button(-text=>"こっちはgrid")
    ->grid(-row=>3, -columnspan=>4);

MainLoop;
# ---
# frame_lr.pl

■ ラベル付フレーム

ラベル付フレーム(LabFrame)はフレームにラベルをつけたものです.使用するには,use Tk::LabFrame でモジュールをロードする必要があります.

書式: use Tk::LabFrame
   $child = $parent->LabFrame(?options?)

主なオプション: Frameと同じ,新しいオプションは以下の通り

オプション 説明 オプション値の例
-label => text フレームにつけるラベル "ラベル"
-labelside => where ラベルをフレームのどこにつけるかを指定. 'left', 'right', 'top', 'bottom', 'acrosstop'

補足:
LabFrameのオプション-labelsideはほとんどの場合,'acrosstop'としておけば問題ないと思います.これはフレームをgrooveレリーフで囲い左上にラベルを置くものです.

間隔をあけるために,-borderwidthを指定した方がいいかもしれません.

先ほどの例で,FrameをLabFrameに変えてみましょう.