You are here

Tk의 메뉴(menu)

admin의 아바타
첨부 파일파일 크기
Image icon menu1.png6.72 KB
Image icon menu2.png6.81 KB
Image icon menu3.png6.83 KB
Image icon menu4.png6.88 KB
Image icon menu5.png6.34 KB
Image icon menu6.png6.04 KB
Image icon menu7.png6.86 KB
Image icon menu8.png7.81 KB
Image icon menu9.png6.22 KB

메뉴는 다음과 같은 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
}
카테고리: