메뉴는 다음과 같은 6종류가 있습니다.
- 메뉴 바의 풀다운 메뉴
toplevel의 -menu 옵션으로 만드는 메뉴입니다. - 메뉴 버튼의 풀다운 메뉴
menubutton의 -menu 옵션으로 만드는 메뉴입니다. - 팝업 메뉴
tk_popup 프로시져로 만드는 메뉴입니다. - 옵션 메뉴
tk_optionMenu 프로시져로 만드는 메뉴입니다. - 클론 메뉴
-tearoff 옵션으로 분리된 메뉴입니다. - 시스템 메뉴(윈도우즈만 해당)
형식
메뉴는 아래의 커맨드 형식으로 작성합니다.
pathname add type ?option value option value ...?
type은, cascade, command, checkbutton, radiobutton, separator 중에서 한 개를 선택합니다.
메뉴 바 Tk8.0 ~
menu 커맨드로 툴바를 만들수 있습니다. toplevel 윈도우에 대하여 메뉴를 추가합니다.
set toolbar 1
set view 1
menu .menu
.menu add cascade -label {파일(F)} -underline 3 -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 3 -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 {파일(file)(F)} -underline 3 -menu .menu.file.menu -font { 굴림체 9 }
menubutton .menu.view -text {표시(V)} -underline 3 -menu .menu.view.menu -font { 굴림체 9 }
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 3 -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 7 -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_popupMenu 프로시져를 사용하면, 옵션 메뉴 바튼을 만들 수 있습니다.
set var 귤
tk_optionMenu .o var 사과 귤 바나나
pack .o
.o configure -font {굴림체 9}
.o.menu add separator
.o.menu add radiobutton -label 메론 -variable var -value 메론
클론 메뉴
-tearoff 옵션으로 값 1을 지정해 준다면 메뉴의 절취선(?) 이 표시됩니다. 기본으로 표시됩니다. 절취선을 클릭하면 메뉴가 팝업으로 분리됩니다. 메뉴의 클론을 만드는 것을 할 수 있게 되는 겁니다.
시스템 메뉴
시스템 메뉴는 타이틀바의 왼쪽에 작은 아이콘을 클릭하면 표시되는 메뉴입니다. Alt + Space 키로도 열립니다. 시스템 메뉴는 특수한 패스를 사용합니다. (윈도우즈만 해당)
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/Tk 8.4 에서 추가된 커맨드입니다.
센스티브 (sensitive) 제어
메뉴의 센스티브 제어는, -state 옵션으로 지정하며, normal, active, disabled 가 있습니다. normal과 active는 동일한 의미입니다. disabled는 메뉴에 gray 색으로 표시되며 선택할 수 없게 됩니다.
가상 이벤트
메뉴에 포커스가 발생할때에 발생된 가상 이벤트가 준비되어 있습니다. 메뉴 엔트리의 설명을 표시하는 등의 처리를 할 때 사용할 수 있을 것 같습니다.
bind . <<MenuSelect>> {
catch {%W entrycget active -label} label
}