メニュー・メニューボタン

■ メニューウィジェット

メニューバーは,様々なコマンドを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