メニューバーは,様々なコマンドをGUIから実行する上で必要なものです.メニューの作り方は少し複雑ですが,がんばって覚えましょう.
書式: $child = $parent->Menu(?options?)
主なオプション:
オプション | 説明 | オプション値の例 |
-tearoff => x | メニューを切り離すモードを決める | 'on', 'off' |
-selectcolor=>color | メニューエントリの型が,ラジオボタン,チェックボタンの場合,選択時の色を指定 | 'red', '#ff0000' |
主なメソッド:
メニューの作り方:
1.$mw->Menu() で,トップのメニューバーになるメニューオブジェクトを作り,メインウィンドウに-menuとして渡す.
$menu= $mw->Menu(); $mw->configure(-menu=>$menu)
2.メニューバーに並べる項目を,'cascade'として追加する.見やすいように'separator'を加えても良い.これらはウィンドウ上部に横に並ぶ.
$menu->add('cascade', -label => "Item1"); $menu->add('cascade', -label => "Item2"); $menu->add('cascade', -label => "Item3");
3.メニューをクリックした際,カスケードされるエントリを追加する.手順としては,$item1というメニューを新規作成し,entryconfigureメソッドで,$menuのエントリItem1と$item1をリンクさせる.その後はaddメソッドで,'command'を加えていく.見やすいように,'separator'を入れても良い.
$item1 = $menu->Menu(); $menu->entryconfigure("Item1", -menu=>$item1); $item1->add('command', -label => "Command1", -command=> \&cmd1); $item1->add('command', -label => "Command2", -command=> \&cmd2); $item1->add('separator'); $item1->add('command', -label => "Command3", -command=> \&cmd3);
4.Item2, Item3について上記3を繰り返す.'command'以外に,'checkbutton'や'radiobutton'も定義可能.オプションについては,それぞれのウィジェットを参照のこと.デフォルトではtearoffがonになっているので,切り取り線をクリックするとメニューが切り離される.いやな場合は,$item1 = $menu->Menu(-tearoff=>'no')のようにする.
5.メニューが長くなりすぎる場合は,'cascade'エントリを挿入し,2,3を同様に行えば良い.
サンプル:ノートパッドもどき
#!/usr/bin/perl -w use Tk; $mw = MainWindow->new; $menu = $mw->Menu(); #メニューバー $mw->configure(-menu =>$menu); $menu->add('cascade', -label=>"ファイル"); $menu->add('cascade', -label=>"へルプ"); #ファイルメニュー $file_menu = $menu->Menu(-tearoff=>'no'); $menu->entryconfigure("ファイル", -menu => $file_menu); $file_menu->add('command', -label=>"新規作成"); $file_menu->add('command', -label=>"開く"); $file_menu->add('command', -label=>"上書き保存"); $file_menu->add('command', -label=>"名前を付けて保存"); $file_menu->add('separator'); $file_menu->add('command', -label=>"終了", -command => sub { exit; } ); #へルプメニュー $help_menu = $menu->Menu(); $menu->entryconfigure("へルプ", -menu => $help_menu); $help_menu->add('command', -label=>"トピックの検索"); $help_menu->add('separator'); $help_menu->add('command', -label=>"バージョン情報"); #ダミー $mw->Scrolled('Text', -scrollbars=>'se', -background=>'white', -width=>90) ->pack(-fill=>'both', -expand=>'yes'); MainLoop; #--- #menu.pl
メニューボタンは,メニューと同等の機能を持っていますが,ボタンなのでジオメトリマネジャを使って配置します.ウィンドウの上部だけでなく色々なところに取りつけられます.
書式: $child = $parent->Menubutton(?options?)
主なオプション:
オプション | 説明 | オプション値の例 |
-indicatoron => boolean | メニューボタンにインジケータをつける | 'on', 'off' |
-menu => $menu | メニューボタンに関連付けるメニューオブジェクト | $menu1 |
-direction => direction | メニューのポップアップする方向を指定 | 'above', 'below', 'right', 'left', 'flush' |
-menuitems => @menulist | メニュー項目のリスト(オプショナル) | ['command'=>"File", -command=> \&Open_file], "-", ['command'=>"Exit", -command=>sub{exit;}] |
主なメソッド:
メニューボタンの作り方:
1.メニューボタン$mbutを作る.
$mbut= $mw->Menubutton(-text=>"メニューボタン", -tearoff=>'no', -indicatoron=>'yes') ->pack();
2.メニューボタンに並べる項目を追加する.見やすいように'separator'を加えても良い.
$mbut->command(-label => "Command1", -command=> \&cmd1); $mbut->command(-label => "Command2", -command=> \&cmd2); $mbut->cascade(-label => "Cascade"); $mbut->separator; $mbut->command(-label => "Command3", -command=> \&cmd3);
3.カスケードに対しては,Menuの時と同様に,サブメニュー$casをMenuで作り,entryconfigureメソッドでリンクさせる.
$cas = $mbut->Menu(); $mbut->entryconfigure("Cascade", -menu=>$cas);
4.以下同様に,$casに対して2.の手順を行う.
サンプル:多段カスケード
#!/usr/bin/perl -w use Tk; $mw = MainWindow->new; $lab = "メニューボタン"; $msg = "メニューボタンサンプル"; $mw->Label(-textvariable=>\$msg, -relief=>'sunken') ->pack(-fill=>'x'); $mbut = $mw->Menubutton(-textvariable=>\$lab, -width=>20, -relief=>'raised', -indicatoron=>'yes', -tearoff=>'no') ->pack(-fill=>'both', -side=>'left'); $mw->Button(-text=>"終了", -width=>10, -command=> sub{ exit; }) ->pack(-fill=>'both', -side=>'left'); for($mb=$mbut,$i=1; $i<30; $i++) { $mb->command(-label => "コマンド$i", -command=> [\&Select_command, $i]); if ($i%10 == 0) { $mb->cascade(-label => "More..."); $more = $mb->Menu(-tearoff=>'no'); $mb->entryconfigure("More...", -menu=>$more); $mb = $more; } } MainLoop; sub Select_command { my $val = $_[0]; $lab = "コマンド$val"; $msg = "$lab が選択されました"; } #--- #menubutton.pl