メニュー

メニューは次の6種類があります。

形式

メニューは以下のコマンド形式で作成します。
pathName add type ?option value option value...?
typeは、cascade, command, checkbutton, radiobutton, separatorから1つを選びます。

メニューバー Tk8.0〜

menuコマンドでツールバーを作ることができます。
toplevelウィンドウに対してメニューを追加します。

プルダウンメニュー プルダウンメニュー
set toolbar 1
set view 1

menu .menu
.menu add cascade -label {ファイル(F)} -underline 5 -menu .menu.file
.menu add cascade -label {表示(V)} -underline 3 -menu .menu.view

menu .menu.file -tearoff no
.menu.file add command -label {開く(O)...} -underline 3 -accelerator "Ctrl+O"
.menu.file add separator
.menu.file add command -label {終了(X)} -underline 3 -command exit

menu .menu.view -tearoff no
.menu.view add checkbutton -label {ツールバー(T)} -underline 6 -variable toolbar
.menu.view add separator
.menu.view add radiobutton -label {一覧(L)} -underline 3 -value 1 -variable view
.menu.view add radiobutton -label {詳細(D)} -underline 3 -value 2 -variable view

. configure -menu .menu

bind all <Control-o> {bell}
-label でメニューのラベルを指定しますが、-bitmapや-imageでイメージを与えることもできます。
-underlineでショートカットキーの位置を0からの数字で指定します。
-acceleratorでアクセラレータキーを指定します。最後にアクセラレータキーのbindを行っています。
-commandでメニューをクリックした時のアクションを定義できます。

メニューボタン

menubuttonでもメニューバーを作ることができます。
メニューバーとはLook&Feelが若干異なります。

プルダウンメニュー プルダウンメニュー
set toolbar 1
set view 1

frame .menu
pack .menu -side top -fill x

menubutton .menu.file -text {ファイル(F)} -underline 5 -menu .menu.file.menu
menubutton .menu.view -text {表示(V)} -underline 3 -menu .menu.view.menu
pack .menu.file .menu.view -side left

menu .menu.file.menu -tearoff no
.menu.file.menu add command -label {開く(O)...} -underline 3 -accelerator "Ctrl+O"
.menu.file.menu add separator
.menu.file.menu add command -label {終了(X)} -underline 3 -command exit

menu .menu.view.menu -tearoff no
.menu.view.menu add checkbutton -label {ツールバー(T)} -underline 6 -variable toolbar
.menu.view.menu add separator
.menu.view.menu add radiobutton -label {一覧(L)} -underline 3 -value 1 -variable view
.menu.view.menu add radiobutton -label {詳細(D)} -underline 3 -value 2 -variable view

bind all <Control-o> {bell}

ポップアップメニュー

tk_popupプロシジャを使うと、右ボタンメニューを作ることができます。
ウィンドウの上でマウスの右ボタンを押した位置にメニューを表示します。

ポップアップメニュー
menu .popup -tearoff no
.popup add command -label {開く(O)...} -underline 3 -accelerator "Ctrl+O"
.popup add separator
.popup add command -label "終了(X)" -underline 3 -command exit

bind . <3> { tk_popup .popup %X %Y }
bind all <Control-o> {bell}

オプションメニュー

tk_optionMenuプロシジャを使うと、オプション・メニューボタンを作ることができます。

オプションメニュー
set var みかん

tk_optionMenu .o var りんご みかん バナナ
pack .o
0
.o.menu add separator
.o.menu add radiobutton -label メロン -variable var -value メロン

クローンメニュー

-tearoffオプションに真の値(1, yes, on)を与えるとメニューに切り取り線が表示されます。
デフォルトは真なので表示されます。
切り取り線上でクリックするとメニューがポップアップして分離されます。
メニューのクローン(分身)を作ることができます。

切り取り線付きプルダウンメニュークローンメニュー

システムメニュー

システムメニューは、タイトルバーの左の小さいアイコンをクリックすると表示するメニューです。
Alt + Space キーでも開きます。Systemという特殊なパスを使います。(Windowsのみ)

オプションメニュー
set topmost 0

menu .menu
. configure -menu .menu
menu .menu.system -tearoff 0
.menu.system add separator
.menu.system add checkbutton -label {ウィンドウを最前面に固定する} -variable topmost -command topmost
.menu add cascade -label System -menu .menu.system

proc topmost {} {
    global topmost
    wm attributes . -topmost $topmost
    .menu add cascade -label System -menu .menu.system
}
※wm attributesコマンドはTcl/Tk8.4で追加されたコマンドです。

センシティブ制御

メニューのセンシティブ制御は、-stateオプションで行います。
状態として、normal, active, disabledがあります。normalとactiveは同じ意味です。
disabled状態はメニューがグレー表示になり選択できなくなります。

センシティブ制御
menu .menu
.menu add cascade -label State -menu .menu.sub

menu .menu.sub -tearoff no
.menu.sub add command -label normal -state normal
.menu.sub add command -label active -state normal
.menu.sub add command -label disabled -state normal

. configure -menu .menu

.menu.sub entryconfigure disabled -state disabled

仮想イベント

メニューにフォーカスがあたった時に発生する仮想イベントが用意されています。
メニューエントリの説明を表示する処理を記述する時に使えそうです。

bind . <<MenuSelect>> {
    catch {%W entrycget active -label} label
}