メニュー(http://homepage3.nifty.com/kaku-chan/tcl_tk/chapter_225.html より引用)
メニューは通常、トップレベルのウィンドウの上部に付いています。メニューには色々な要素が多いの
で、例を豊富に揃えてみました。
例
まずは最も簡単な例から。
実行すると次のようになります。
3行目が最上位のメニュー項目になります。このメニューには下位階層として「開く」
「保存」
「終了」
という項目を付けたいので、形式を cascade スタイルにします。これが5行目の「.m1 add cascade ...」
の意味です。さらに表記文字は -label オプションで指定し、下位階層のメニュー項目を -menu オプシ
ョンで指定します。一方、下位階層は4行目で .m1.files というウィジットを定義していますが、ここ
に追加する要素を 6 ~ 9 行目で指定しています。
「開く」
「保存」
「終了」の3つの要素は選択されると
コマンドを実行するので、形式を command スタイルにします。これが「.m1.files add command ...」
の意味です。選択されたときに実行するコマンドは -command オプションで指定します。メニューの区
切りを表示するには、8行目のように separator スタイルを指定します。
10 行目はトップレベルウィンドウに -menu オプションを用いてメニューバーを設定する記述です。オ
プション -menu については、 トップレベルのウィンドウを作る で解説してあります(toplevel コマ
ンドのオプション)
。
これをウィンドウ "." に対して configure ウィジットコマンドで後から設定して
いることになります。
今度は最上位のメニューに「オプション」項目を追加してみます。
1 : set FONT {{MS Pゴシック} 10 normal}2 :
3 : menu .m1; # ここは「ファイル」を表示するメニュー要素 4 : menu .m1.files; # ここは「ファイル」以下のメニュー要素 5 : .m1 add cascade -label ファイル -font $FONT -menu .m1.files
6 : .m1.files add command -label 開く -font $FONT -command tk_getOpenFile 7 : .m1.files add command -label 保存 -font $FONT -command tk_getSaveFile 8 : .m1.files add separator
9 : .m1.files add command -label 終了 -font $FONT -command exit 10 : . configure -menu .m1; # ここでメニューバーに設定
1 : set FONT {{MS Pゴシック} 10 normal} 2 :
3 : menu .m1; # ここは「ファイル」「オプション」を表示するメニュー要素 4 : menu .m1.files; # ここは「ファイル」以下のメニュー要素
実行すると次のようになります。
実行すると次のようになります
最初の例に比べて、5、15、16 行目が追加になっています。このようにしてメニュー要素を追加してい
けばよいことがわかります。
ところで、上記2つの例では、メニューを表示したときに「ファイル」や「オプション」と下位階層と
の間に破線が表示されています。この破線をマウスでクリックすると、メニュー項目を別ウィンドウに
「引き剥す」ことができます(下図において、左から右の形式に変化します)
。
この機能は、メニューに -tearoff false を指定すると無効にすることができます。その際は破線も表
示されなくなります。例えば2番目の例の4行目で「menu .m1.files -tearoff false」とすると、
「フ
ァイル」メニューは引き剥せなくなります。
6 :7 : # 「ファイル」と「ファイル以下の階層」を以下で設定
8 : .m1 add cascade -label ファイル -font $FONT -menu .m1.files
9 : .m1.files add command -label 開く -font $FONT -command tk_getOpenFile 10 : .m1.files add command -label 保存 -font $FONT -command tk_getSaveFile 11 : .m1.files add separator
12 : .m1.files add command -label 終了 -font $FONT -command exit 13 :
14 : # 「オプション」と「オプション以下の階層」を以下で設定
15 : .m1 add cascade -label オプション -font $FONT -menu .m1.options
16 : .m1.options add command -label 配色 -font $FONT -command tk_chooseColor 17 :
18 : . configure -menu .m1; # ここでメニューバーに設定
3番目の例はショートカットキーの設定です。
実行して Alt + F キーを押す(または Alt キーを押してから F を押す、あるいは Alt キーを押して
から ↓ キーを押す)と次のようになります。
最上位の部分(というより、タイプとして cascade を指定したもの)は -underline オプションを使い
ます。このオプションは数字を引数にとり、指定した位置にある文字をショートカットキーに設定しま
す。したがって、メニュー項目の表示文字列を「ファイル(F)」のように工夫する必要があります。位置
は 0(ゼロ)から始まるので、この場合は5番目の位置の文字 F にショートカットキーが設定されます
(日本語も1文字と数えます、8行目参照)
。
メニューの下位階層(タイプが command のもの)は -accelerator オプションで指定します。ただし、
ここで指定できるのは表示文字列だけなので、 20 ~ 22 行目のように、実際にはイベントを関連付け
ておかなければなりません。イベントの扱いについては、例から何となく意味がわかると思いますが、
詳細は イベント処理 を参照してください。 20 行目のイベント設定は「ウィンドウ "." においてコン
トロールキーと"o" を同時に押すと、 tk_getOpenFile を実行する」ことを示しています。ここまで実
施すると、きちんとしたメニューらしくなります。
4番目の例は中間階層に cascade タイプのメニューを配置し、ラジオボタンタイプ、チェックボタンタ
イプのメニューを追加した例です。
「オプション」メニューを「表示」メニューに変えて、いろいろ配置
1 : set FONT {{MS Pゴシック} 10 normal} 2 :
3 : menu .m1
4 : menu .m1.files -tearoff false; # 引き剥せなくしてみました 5 : menu .m1.options -tearoff false; # 引き剥せなくしてみました 6 :
7 : # 「ファイル」と「ファイル以下の階層」を以下で設定
8 : .m1 add cascade -label ファイル(F) -font $FONT -menu .m1.files -underline 5
9 : .m1.files add command -label 開く -font $FONT -command tk_getOpenFile -accelerator "Ctrl-O" 10 : .m1.files add command -label 保存 -font $FONT -command tk_getSaveFile -accelerator "Ctrl-S" 11 : .m1.files add separator
12 : .m1.files add command -label 終了 -font $FONT -command exit 13 :
14 : # 「オプション」と「オプション以下の階層」を以下で設定
15 : .m1 add cascade -label オプション(O) -font $FONT -menu .m1.options -underline 6
16 : .m1.options add command -label 配色 -font $FONT -command tk_chooseColor -accelerator "Ctrl-C" 17 :
18 : # -accelerator オプションは表示だけなので、実際にキーイベントを設定
19 : # 「コントロールキー + O」は「Control-o」のように表現する規則(o は小文字にする) 20 : bind . <Control-o> tk_getOpenFile
21 : bind . <Control-s> tk_getSaveFile 22 : bind . <Control-c> tk_chooseColor 23 :
してみました。
1 : set FONT {{MS Pゴシック} 10 normal} 2 :
3 : menu .m1
4 : menu .m1.files -tearoff false; 5 : menu .m1.display -tearoff false;
6 : menu .m1.display.toolbar -tearoff false; 7 : menu .m1.display.zoom -tearoff false; 8 : menu .m1.display.style -tearoff false; 9 :
10 : # 「ファイル」と「ファイル以下の階層」を以下で設定
11 : .m1 add cascade -label ファイル(F) -font $FONT -menu .m1.files -underline 5
12 : .m1.files add command -label 開く -font $FONT -command tk_getOpenFile -accelerator "Ctrl-O" 13 : .m1.files add command -label 保存 -font $FONT -command tk_getSaveFile -accelerator "Ctrl-S" 14 : .m1.files add separator
15 : .m1.files add command -label 終了 -font $FONT -command exit 16 :
17 : # 「表示」と「表示以下の階層」を以下で設定
18 : .m1 add cascade -label 表示(V) -font $FONT -menu .m1.display -underline 3 19 : .m1.display add cascade -label "ツールバー(T)" -font $FONT \
20 : -menu .m1.display.toolbar -underline 6 21 : .m1.display add separator
22 : .m1.display add cascade -label "ズーム(Z)" -font $FONT \ 23 : -menu .m1.display.zoom -underline 4 24 : .m1.display add cascade -label "スタイル(S)" -font $FONT \ 25 : -menu .m1.display.style -underline 5 26 :
27 : # 「ツールバー」の下の階層のメニューを作成
28 : .m1.display.toolbar add checkbutton -label パネル -font $FONT \ 29 : -onvalue 1 -offvalue 0 -variable optionPanel
30 : .m1.display.toolbar add checkbutton -label ナビゲーションバー -font $FONT \ 31 : -onvalue 1 -offvalue 0 -variable optionNavi
32 : .m1.display.toolbar add checkbutton -label ステータスバー -font $FONT \ 33 : -onvalue 1 -offvalue 0 -variable optionStatus 34 :
35 : # 「ズーム」の下の階層のメニューを作成
36 : .m1.display.zoom add radiobutton -label 400% -font $FONT \ 37 : -value 400 -variable zoomVal
38 : .m1.display.zoom add radiobutton -label 200% -font $FONT \ 39 : -value 200 -variable zoomVal
40 : .m1.display.zoom add radiobutton -label 100% -font $FONT \ 41 : -value 100 -variable zoomVal
42 : .m1.display.zoom add radiobutton -label 50% -font $FONT \ 43 : -value 50 -variable zoomVal
44 : .m1.display.zoom add radiobutton -label 25% -font $FONT \ 45 : -value 25 -variable zoomVal
46 :
47 : # 「スタイル」の下の階層のメニューを作成
48 : .m1.display.style add radiobutton -label 標準 -font $FONT \ 49 : -value normal -variable styleVal
50 : .m1.display.style add radiobutton -label クラシック -font $FONT \ 51 : -value classic -variable styleVal
52 : 53 : # 変数の初期値を設定しておく 54 : set optionPanel 1 55 : set optionNavi 0 56 : set optionStatus 1 57 : set zoomVal 100 58 : set styleVal normal 59 :
60 : # -accelerator オプションは表示だけなので、実際にキーイベントを設定
61 : # 「コントロールキー + O」は「Control-o」のように表現する規則(o は小文字にする) 62 : bind . <Control-o> tk_getOpenFile
63 : bind . <Control-s> tk_getSaveFile 64 :
実行して適当に操作すると、例えば次のようになります。
チ ェッ クボ タン やラ ジオ ボタ ンの 部分 を操 作し て、 wish の コン ソー ルウ ィン ドウ 上で 「 puts
$optionPanel」などとすれば、変数の値が適切に設定されることがわかると思います。
5番目の例はアイコンの設定です。綺麗なアイコンを作るために ダウンロードサイト で紹介している
ICONS を利用しています。
※ ところで、この4番目の例だと「表示」以下のメニューに対して "T" "Z" "S" のショートカット キーが効きません。メニューの文字列をすべてアルファベット(半角)にしたら動作したので、処理 系に少々不具合があるのかも知れません。1 : set FONT {{MS Pゴシック} 10 normal} 2 :
3 : # 以下は「開く」イメージ
4 : image create photo fileopen16 -data {
5 : R0lGODlhEAAQAIUAAPwCBAQCBOSmZPzSnPzChPzGhPyuZEwyHExOTFROTFxa 6 : VFRSTMSGTPT29Ozu7Nze3NTS1MzKzMTGxLy6vLS2tLSytDQyNOTm5OTi5Ly+ 7 : vKyqrKSmpIyOjLR+RNTW1MzOzJyenGxqZBweHKSinJSWlExKTMTCxKyurGxu 8 : bBQSFAwKDJyanERCRERGRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 9 : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAaR 10 : QIBwGCgGhkhkEWA8HpNPojFJFU6ryitTiw0IBgRBkxsYFAiGtDodDZwPCERC 11 : EV8sEk0CI9FoOB4BEBESExQVFgEEBw8PFxcYEBIZGhscCEwdCxAPGA8eHxkU 12 : GyAhIkwHEREQqxEZExUjJCVWCBAZJhEmGRUnoygpQioZGxsnxsQrHByzQiJx 13 : z3EsLSwWpkJ+QQAh/mhDcmVhdGVkIGJ5IEJNUFRvR0lGIFBybyB2ZXJzaW9u 14 : IDIuNQ0KqSBEZXZlbENvciAxOTk3LDE5OTguIEFsbCByaWdodHMgcmVzZXJ2 15 : ZWQuDQpodHRwOi8vd3d3LmRldmVsY29yLmNvbQA7 16 : } 17 : 18 : # 以下は「保存」イメージ
19 : image create photo filesave16 -data {
20 : R0lGODlhEAAQAIUAAPwCBAQCBFRSVMTCxKyurPz+/JSWlFRWVJyenKSipJSS 21 : lOzu7ISChISGhIyOjHR2dJyanIyKjHx6fMzOzGRiZAQGBFxeXGRmZHRydGxq 22 : bAwODOTm5ExOTERGRExKTHx+fGxubNza3Dw+PDQ2NAAAAAAAAAAAAAAAAAAA 23 : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 24 : AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAAAALAAAAAAQABAAAAaA 25 : QIAQECgOj0jBgFAoBpBHpaFAbRqRh0F1a30ClAhuNZHwZhViqgFhJizSjIZX 26 : QCAoHOKHYw5xRBiAElQTFAoVQgINFBYXGBkZFxYHGRqIDBQbmRwdHgKeH2Yg 27 : HpmkIR0HAhFeTqSZIhwCFIdIrBsjAgcPXlBERZ4Gu7xCRZVDfkEAIf5oQ3Jl 28 : YXRlZCBieSBCTVBUb0dJRiBQcm8gdmVyc2lvbiAyLjUNCqkgRGV2ZWxDb3Ig 29 : MTk5NywxOTk4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KaHR0cDovL3d3dy5k 30 : ZXZlbGNvci5jb20AOw== 31 : } 32 : 33 : menu .m1
34 : menu .m1.files -tearoff false; # 引き剥せなくしてみました 35 : menu .m1.options -tearoff false; # 引き剥せなくしてみました 36 :
「ファイル」メニューを引き出してみると、次のようになります。
image コマンドもまだ解説していませんが、
「できる」ということを知っておけばとりあえずよいでしょ
う(実際には ICONS のツールを使うと image コマンド部分を作り出してくれるので、それをそのまま
利用します)
。
menu コマンド
上記の例に示しただけでも通常の使用には十分と思いますが、
ここで menu コマンドの形式を示します。
コマンド書式 menu pathName ?options?
説明
第1引数にはメニューウィジットとして使われるパス名を指定する。options の部分
にはいくつかのウィジット標準オプションと、menu コマンド特有のオプションを指
定できる。どのようなオプションがあるかについては以下で解説する。
つまり、menu に続けてドット区切りのウィジット名、オプション、というように記述します。
37 : # 「ファイル」と「ファイル以下の階層」を以下で設定 38 : # ここではアイコンイメージを設定39 : .m1 add cascade -label ファイル(F) -font $FONT -menu .m1.files -underline 5 40 : .m1.files add command -label 開く -font $FONT -command tk_getOpenFile \ 41 : -accelerator "Ctrl-O" -image fileopen16 \
42 : -compound left
43 : .m1.files add command -label 保存 -font $FONT -command tk_getSaveFile \ 44 : -accelerator "Ctrl-S" -image filesave16 \
45 : -compound left 46 : .m1.files add separator
47 : .m1.files add command -label 終了 -font $FONT -command exit 48 :
49 : # 「オプション」と「オプション以下の階層」を以下で設定
50 : .m1 add cascade -label オプション(O) -font $FONT -menu .m1.options -underline 6 51 : .m1.options add command -label 配色 -font $FONT -command tk_chooseColor \ 52 : -accelerator "Ctrl-C"
53 :
54 : # -accelerator オプションは表示だけなので、実際にキーイベントを設定
55 : # 「コントロールキー + O」は「Control-o」のように表現する規則(o は小文字にする) 56 : bind . <Control-o> tk_getOpenFile
57 : bind . <Control-s> tk_getSaveFile 58 : bind . <Control-c> tk_chooseColor 59 :
60 : . configure -menu .m1; # ここでメニューバーに設定
※ この例を実行してみると、「ファイル」メニューを引き出した直後、アイコンの表 示がちょっと変です。マウスカーソルを合わせて一旦反転表示させるときちんと出る のですが...。理由は不明です。