본문으로 바로가기

Tk의 메뉴(menu)

category 카테고리 없음 2024. 4. 30. 13:08

메뉴는 다음과 같은 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
}