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 でモジュールをロードする必要があります.
主なオプション: Frameと同じ,新しいオプションは以下の通り
オプション | 説明 | オプション値の例 |
-label => text | フレームにつけるラベル | "ラベル" |
-labelside => where | ラベルをフレームのどこにつけるかを指定. | 'left', 'right', 'top', 'bottom', 'acrosstop' |
補足:
LabFrameのオプション-labelsideはほとんどの場合,'acrosstop'としておけば問題ないと思います.これはフレームをgrooveレリーフで囲い左上にラベルを置くものです.
間隔をあけるために,-borderwidthを指定した方がいいかもしれません.
先ほどの例で,FrameをLabFrameに変えてみましょう.