menu / tk_menuSetFocus — 메뉴 위젯과 메뉴바 만들기
menu / tk_menuSetFocus — 메뉴 위젯과 메뉴바 만들기
응용의 명령들을 메뉴바나 팝업으로 묶어 제공하고 싶을 때가 있어요. Tk의 menu 명령은 팝업 창으로 쓰거나 toplevel의 메뉴바로 쓸 수 있는 메뉴 위젯을 만듭니다. tk_menuSetFocus는 메뉴에 포커스를 설정하는 보조 명령이에요.
본문
개요
menu pathName ?options?
tk_menuSetFocus pathName
menu 명령은 pathName 인자로 주어진 새 최상위 창을 만들고 메뉴 위젯으로 만듭니다. 이 메뉴 위젯은 팝업 창으로 쓰거나 toplevel의 -menu 옵션에 적용해 그 toplevel의 메뉴바로 만들 수 있어요. 색, 글꼴 같은 메뉴의 측면을 구성하는 옵션을 명령줄이나 옵션 데이터베이스로 지정할 수 있습니다. menu 명령은 pathName 인자를 돌려줍니다. 호출 시점에 pathName이라는 창이 존재해서는 안 되지만, pathName의 부모는 존재해야 해요.
menu는 하나 이상의 열에 배열된 한 줄짜리 엔트리들의 모음을 표시하는 위젯입니다. 각각 다른 속성을 가진 여러 종류의 엔트리가 존재해요. 다른 유형의 엔트리도 한 메뉴에 섞어 쓸 수 있습니다. 메뉴 엔트리는 entry 위젯과 같지 않아요. 실제로 메뉴 엔트리는 별개의 위젯조차 아닙니다. 전체 메뉴가 하나의 위젯이죠.
메뉴 엔트리는 최대 세 개의 별도 필드로 표시됩니다. 주 필드는 -label, -bitmap, -image 옵션이 제어하는 텍스트 문자열·비트맵·이미지 형태의 라벨이에요. 엔트리에 -accelerator 옵션이 지정되면 라벨 오른쪽에 두 번째 텍스트 필드가 표시됩니다. 가속기(accelerator)는 보통 메뉴 엔트리 호출과 같은 결과를 응용에서 내게 할 키 입력 시퀀스를 설명해요. 이것은 표시 옵션으로, 실제로 해당 바인딩을 설정하진 않습니다(bind 명령으로 설정할 수 있어요). 세 번째 필드는 indicator입니다. indicator는 checkbutton이나 radiobutton 엔트리에만 있으며, 엔트리가 선택됐는지 나타내고 엔트리 문자열의 왼쪽에 표시돼요.
일반적인 사용에서 엔트리는 마우스 포인터가 그 위에 있을 때마다 활성화됩니다(자신을 다르게 표시). 엔트리 위에서 마우스 버튼을 놓으면 엔트리가 *호출(invoked)*돼요. 호출의 효과는 각 엔트리 유형마다 다르며, 아래 개별 엔트리 섹션에서 설명합니다.
엔트리는 disabled될 수 있는데, 그 경우 라벨과 가속기가 더 어두운 색으로 표시됩니다. 기본 메뉴 바인딩은 disabled 엔트리가 활성화되거나 호출되는 것을 허용하지 않아요. disabled 엔트리는 다시 활성화할 수 있으며, 그 시점부터 다시 활성·호출할 수 있게 됩니다.
메뉴의 활성 엔트리가 바뀔 때마다 <<MenuSelect>> 가상 이벤트가 메뉴로 전송됩니다. 그다음 메뉴에서 활성 항목을 조회하고, 엔트리의 컨텍스트에 맞는 도움말 텍스트를 설정하는 같은 동작을 취할 수 있어요.
표준 옵션
-activebackground, -activeborderwidth, -activeforeground, -background 또는 -bg, -borderwidth 또는 -bd, -cursor, -disabledforeground, -font, -foreground 또는 -fg, -relief, -takefocus 옵션이 표준 옵션으로 제공됩니다.
위젯 전용 옵션
-postcommand (데이터베이스 이름 postCommand, 클래스 Command) — 이 옵션을 지정하면 메뉴가 포스트될 때마다 실행할 Tcl 명령을 제공합니다. post 위젯 명령이 메뉴를 포스트하기 전에 이 명령을 호출해요. 참고로 Tk 8.0 이후 Macintosh와 Windows에서는 메뉴 시스템의 모든 post-command가 그 메뉴들 중 어느 것도 포스트되기 전에 모두 실행됩니다. 이것은 각 플랫폼의 메뉴 매니저 제한 때문이에요.
-selectcolor (데이터베이스 이름 selectColor, 클래스 Background) — check button이나 radio button인 메뉴 엔트리에서, 그 버튼이 선택됐을 때 indicator에 표시할 색을 지정합니다.
-tearoff (데이터베이스 이름 tearOff, 클래스 TearOff) — 이 옵션은 메뉴 맨 위에 tear-off 엔트리를 포함할지 여부를 지정하는 불리언이어야 해요. 포함하면 메뉴의 엔트리 0으로 존재하고, 다른 엔트리는 1부터 번호가 매겨집니다. 기본 메뉴 바인딩은 tear-off 엔트리가 호출될 때 메뉴가 torn off되도록 합니다. 이 옵션은 메뉴를 tear off할 수 없는 Aqua/macOS에서는 무시돼요.
-tearoffcommand (데이터베이스 이름 tearOffCommand, 클래스 TearOffCommand) — 이 옵션이 비어 있지 않은 값이면 메뉴가 torn off될 때마다 호출할 Tcl 명령을 지정합니다. 실제 명령은 이 옵션의 값 + 공백 + 메뉴 창의 이름 + 공백 + torn off된 메뉴 창의 이름으로 구성돼요. 예를 들어 옵션 값이 "a b"이고 메뉴 .x.y가 torn off되어 새 메뉴 .x.tearoff1을 만들면 "a b .x.y .x.tearoff1" 명령이 호출됩니다. Aqua/macOS에서는 무시돼요.
-title (데이터베이스 이름 title, 클래스 Title) — 이 문자열이 이 메뉴가 torn off될 때 만들어지는 창의 제목으로 사용됩니다. title이 NULL이면 이 메뉴가 호출된 menubutton의 제목이나 cascade 항목의 텍스트가 창 제목이 돼요.
-type (데이터베이스 이름 type, 클래스 Type) — 이 옵션은 menubar, tearoff, normal 중 하나일 수 있고 메뉴 생성 시 설정됩니다. 설정 데이터베이스가 돌려주는 문자열은 이 옵션을 바꾸면 바뀌지만, 메뉴 위젯 동작에는 영향을 주지 않아요. 클로닝 메커니즘에 사용되며 보통 Tk 라이브러리 밖에서는 설정되지 않습니다.
엔트리 유형
명령 엔트리 (COMMAND ENTRIES) — 가장 흔한 메뉴 엔트리로, button 위젯처럼 동작합니다. 명령 엔트리가 호출되면 Tcl 명령이 실행됩니다. Tcl 명령은 -command 옵션으로 지정해요.
구분자 엔트리 (SEPARATOR ENTRIES) — 가로 분할선으로 표시되는 엔트리입니다. 구분자는 활성화되거나 호출될 수 없고, 표시되는 것 외에는 동작이 없어요.
체크버튼 엔트리 (CHECKBUTTON ENTRIES) — checkbutton 위젯처럼 동작합니다. 호출되면 선택·해제 상태를 오가며 토글됩니다. 엔트리가 선택되면 특정 값이 특정 전역 변수에 저장되고(-onvalue와 -variable 옵션), 해제되면 다른 값(-offvalue 옵션)이 저장돼요. 라벨 왼쪽에 indicator 상자가 표시됩니다. 엔트리가 선택되면 indicator 중앙이 엔트리의 -selectcolor 옵션 색으로 표시되고, 그렇지 않으면 메뉴의 배경색으로 표시돼요. -command 옵션을 지정하면 엔트리가 호출될 때마다 그 값이 Tcl 명령으로 평가되는데, 엔트리의 선택 상태를 토글한 뒤에 일어납니다.
라디오버튼 엔트리 (RADIOBUTTON ENTRIES) — radiobutton 위젯처럼 동작합니다. 라디오버튼 엔트리는 한 번에 하나만 선택될 수 있는 그룹으로 구성돼요. 특정 엔트리가 선택되면 특정 값을 특정 전역 변수에 저장합니다(-value와 -variable 옵션). 이 동작은 같은 그룹에서 이전에 선택된 엔트리로 하여금 스스로 선택을 해제하게 해요. 엔트리가 선택된 후에는 그 엔트리의 연관 변수에 어떤 변화가 있어도 엔트리가 스스로 선택을 해제하게 됩니다. 라디오버튼 엔트리의 그룹은 연관 변수에 의해 결정됩니다. 두 엔트리가 같은 연관 변수를 가지면 같은 그룹이에요. 각 라디오버튼 엔트리의 라벨 왼쪽에 indicator 다이아몬드가 표시됩니다. 선택되면 그 중앙이 -selectcolor 색으로, 아니면 메뉴 배경색으로 표시돼요. -command 옵션을 지정하면 엔트리가 선택된 뒤 호출될 때마다 평가됩니다.
캐스케이드 엔트리 (CASCADE ENTRIES) — 연관 메뉴가 있는(-menu 옵션) 엔트리입니다. 캐스케이드 엔트리로 캐스케이딩 메뉴를 만들 수 있어요. postcascade 위젯 명령으로 캐스케이드 엔트리 옆에 연관 메뉴를 포스트·언포스트할 수 있습니다. 연관 메뉴는 캐스케이드 엔트리가 든 메뉴의 자식이어야 해요(메뉴 탐색이 올바르게 동작하는 데 필요합니다).
캐스케이드 엔트리는 menu post x y 형태의 Tcl 명령을 호출해 연관 메뉴를 포스트하는데, menu는 연관 메뉴의 경로 이름, x·y는 캐스케이드 엔트리의 오른쪽 위 모서리의 루트 창 좌표입니다. Unix에서는 menu unpost 형태의 Tcl 명령을 실행해 하위 메뉴를 언포스트하고, 다른 플랫폼에서는 플랫폼의 네이티브 코드가 언포스팅을 처리해요.
캐스케이드 엔트리에 -command 옵션을 지정하면 엔트리가 호출될 때마다 Tcl 명령으로 평가됩니다. 이것은 Windows에서 지원되지 않아요.
티어오프 엔트리 (TEAR-OFF ENTRIES) — -tearoff 옵션으로 켜지면 메뉴 맨 위에 나타나는 엔트리입니다. 다른 메뉴 엔트리와 달리 add 위젯 명령으로 만들 수도, delete 위젯 명령으로 삭제할 수도 없어요. 만들어지면 메뉴 맨 위에 점선으로 나타납니다. 기본 바인딩에서 tear-off 엔트리를 호출하면 메뉴와 모든 서브메뉴의 torn-off 복사본이 만들어져요.
메뉴바 (MENUBARS)
어떤 메뉴든 toplevel 창의 메뉴바로 설정할 수 있습니다(toplevel 명령 참조). Macintosh에서는 toplevel이 앞에 있을 때마다 이 메뉴의 cascade 항목들이 주 모니터 상단 가로 메뉴바에 나타나요. Windows와 Unix에서는 이 메뉴의 항목들이 창 상단의 메뉴바에 표시됩니다. 이 메뉴들은 각 플랫폼의 인터페이스 지침에 따라 동작해요. 메뉴바로 설정된 모든 메뉴에 대해 클론 메뉴가 만들어집니다. 자세한 내용은 CLONES 섹션을 참조하세요.
메뉴바는 플랫폼마다 다르게 동작할 수 있어요. 그 예로 메뉴 안의 checkbutton과 radiobutton 처리 방식이 있어요. 이 메뉴 요소들을 메뉴바에 둘 수는 있지만, 시스템 제한 때문에 일부 플랫폼에서는 indicator와 함께 그려지지 않을 수 있습니다.
메뉴바의 특수 메뉴
메뉴바의 특정 메뉴는 특별히 취급됩니다. Macintosh에서는 특수 Application, Window, Help 메뉴에 접근이 제공돼요. Windows에서는 각 창의 Windows System 메뉴 접근이 제공됩니다. X Windows에서는 Motif 메뉴 호환성이 켜져 있으면 특수 오른쪽 정렬 help 메뉴가 제공될 수 있어요. 모든 경우 이 메뉴들은 메뉴바 메뉴의 명령 이름에 특수 이름을 이어붙여 만들어야 합니다. 예를 들어 .menubar라는 메뉴바에 대해 Macintosh에서는 .menubar.apple, .menubar.window, .menubar.help, Windows에서는 .menubar.system, X Windows에서는 도움말 메뉴 .menubar.help가 특수 메뉴예요.
Tk가 Macintosh에서 메뉴바의 첫 메뉴로 .menubar.apple 메뉴를 보면, 그 메뉴바를 담은 창이 앞에 있을 때마다 그 메뉴의 내용이 Application 메뉴의 첫 항목들이 됩니다. Tk가 정의한 항목들 다음에는 구분자가 오고, 그다음 모든 표준 Application 메뉴 항목들이 와요. 그런 .apple 메뉴는 메뉴가 toplevel의 메뉴바로 처음 설정될 때 메뉴에 있어야 해요. 그렇지 않으면 그 시점에 기본 응용 메뉴(Tk에 숨겨진)가 메뉴바에 삽입되어, 나중에 .apple 메뉴를 추가해도 Application 메뉴가 되지 않습니다.
Tk가 Macintosh에서 .menubar.window 메뉴를 보면, 창의 메뉴바가 앞에 있을 때마다 그 메뉴 내용이 사용자 메뉴바의 표준 Window 메뉴에 삽입됩니다. 메뉴의 첫 항목들은 macOS가 제공하고, 현재 toplevel 이름이 Tk 정의 항목들과 구분자 뒤에 자동으로 덧붙여져요. Mac의 Window 메뉴는 창을 전체 화면 상태로 토글하거나, 운영체제 버전이 지원하면 탭 창 인터페이스(여러 창을 한 창으로 묶음)를 관리하는 것도 허용합니다.
Tk가 Macintosh에서 .menubar.help 메뉴를 보면, 창의 메뉴바가 앞에 있을 때마다 그 메뉴 내용이 사용자 메뉴바의 표준 Help 메뉴에 덧붙여집니다. 첫 항목들은 macOS가 제공해요.
Tk가 Windows에서 System 메뉴를 보면 그 항목들이 메뉴바가 붙은 시스템 메뉴에 덧붙여집니다. 이 메뉴는 응용 아이콘에 연결되고, 마우스나 Alt+Spacebar 입력으로 호출할 수 있어요. Windows API의 제한 때문에 글꼴 변경, 색, 이미지, 비트맵, tearoff 이미지는 시스템 메뉴에 나타나지 않습니다.
Tk가 X Windows에서 Help 메뉴를 보고 Motif 메뉴 호환성이 켜져 있으면, 메뉴가 메뉴바에서 마지막으로 옮겨지고 오른쪽 정렬됩니다. Motif 메뉴 호환성은 Tk 옵션 *Menu.useMotifHelp를 true로 설정하거나 tk::classic::restore menu를 호출해 켭니다.
클론 (CLONES)
메뉴가 toplevel 창의 메뉴바로 설정되거나 메뉴가 torn off되면 메뉴의 클론이 만들어집니다. 이 클론은 그 자체로 메뉴 위젯이지만 원본의 자식입니다. 원본의 설정 변경은 클론에 반영되고, 가리키는 캐스케이드도 메뉴 탐색이 올바르게 되도록 함께 클론됩니다. 클론은 tearoff나 menubar가 사라지거나 원본 메뉴가 파괴될 때 파괴됩니다.
위젯 명령
menu 명령은 이름이 pathName인 새 Tcl 명령을 만듭니다. 일반적인 형태는 다음과 같아요.
pathName option ?arg arg ...?
메뉴의 위젯 명령 대부분은 메뉴의 어떤 엔트리에서 작업할지 나타내는 인자를 하나 받습니다. 이 indicator들을 index라고 부르며 다음 형태 중 하나로 지정할 수 있어요.
active — 현재 활성인 엔트리를 나타냅니다. 활성 엔트리가 없으면 이 형태는 none과 같습니다. 축약할 수 없어요.
end — 메뉴의 맨 아래 엔트리를 나타냅니다. 메뉴에 엔트리가 없으면 none과 같아요. 축약할 수 없습니다.
last — end와 같습니다.
none — "엔트리 없음"을 나타냅니다. 주로 activate 옵션과 함께 메뉴의 모든 엔트리를 비활성화할 때 쓰여요. 대부분의 경우 none을 지정하면 위젯 명령에서 아무 일도 일어나지 않게 합니다. 축약할 수 없어요.
@x,y — 메뉴 창에서 x, y(픽셀 좌표)가 가리키는 점을 덮는 엔트리를 나타냅니다. 그 점을 덮는 엔트리가 없으면 none과 같습니다. 숫자 하나만 지정하면 y 좌표로 취급돼요.
number — 엔트리를 숫자로 지정합니다. 0이 메뉴의 맨 위 엔트리, 1이 그 아래 엔트리 등이에요.
pattern — 인덱스가 위 형태 중 어느 것도 만족하지 않으면 이 형태를 씁니다. pattern은 메뉴의 각 엔트리 라벨에 위에서 아래 순서로 패턴 매칭되어 일치하는 엔트리를 찾습니다. string match 규칙을 사용해요.
인덱스가 위 형태 중 하나 이상에 일치할 수 있다면, 위 목록에서 더 앞선 형태가 우선합니다.
메뉴 위젯에서 사용 가능한 위젯 명령은 다음과 같아요.
pathName activate index — index가 나타내는 엔트리의 상태를 active로 바꾸고 활성 색으로 다시 표시합니다. 이전에 활성인 엔트리는 비활성화돼요. index가 none으로 지정되거나 지정된 엔트리가 disabled면 메뉴는 활성 엔트리가 없는 상태가 됩니다. 빈 문자열을 돌려줘요.
pathName add type ?option value option value ...? — 메뉴 맨 아래에 새 엔트리를 추가합니다. 새 엔트리의 유형은 type으로 주어지며 cascade, checkbutton, command, radiobutton, separator 중 하나(또는 그 고유 약어)여야 해요. 추가 인자가 있으면 MENU ENTRY OPTIONS 섹션의 옵션들을 지정합니다. 빈 문자열을 돌려줘요.
pathName cget option — option으로 주어진 설정 옵션의 현재 값을 돌려줍니다.
pathName clone newPathname ?cloneType? — newPathName이라는 현재 메뉴의 클론을 만듭니다. 이 클론은 그 자체로 메뉴이지만, 클론에 대한 어떤 변경도 원본 메뉴에 전파되고 그 반대도 마찬가지입니다. cloneType은 normal, menubar, tearoff일 수 있어요. 보통 Tk 라이브러리 밖에서 호출해서는 안 됩니다.
pathName configure ?option? ?value option value ...? — 위젯의 설정 옵션을 조회하거나 수정합니다. option을 지정하지 않으면 사용 가능한 모든 옵션을 설명하는 리스트를 돌려주고, option만 지정하면 그 옵션 하나를 설명하는 리스트를 돌려줍니다. option-value 쌍을 지정하면 해당 옵션을 수정하고 빈 문자열을 돌려줘요.
pathName delete index1 ?index2? — index1과 index2 사이(포함)의 모든 메뉴 엔트리를 삭제합니다. index2를 생략하면 index1로 기본값이 정해져요. tear-off 메뉴 엔트리를 삭제하려는 시도는 무시됩니다(대신 -tearoff 옵션을 바꿔 tear-off 항목을 제거해야 해요).
pathName entrycget index option — index로 주어진 엔트리의 설정 옵션 현재 값을 돌려줍니다. option은 MENU ENTRY OPTIONS 섹션의 이름 중 하나일 수 있어요.
pathName entryconfigure index ?options...? — configure 명령과 비슷하지만 개별 엔트리의 옵션에 적용됩니다(configure는 메뉴 전체 옵션에 적용). options가 지정되면 명령에 따라 옵션이 수정되고 빈 문자열을 돌려줘요. 지정하지 않으면 엔트리 index의 현재 옵션을 설명하는 리스트를 돌려줍니다.
pathName index index — index에 해당하는 숫자 인덱스, 또는 index가 none으로 지정되면 none을 돌려줍니다.
pathName insert index type ?option value option value ...? — add 위젯 명령과 같지만 새 엔트리를 메뉴 끝에 붙이는 대신 index로 주어진 엔트리 바로 앞에 삽입합니다. 메뉴에 tear-off 엔트리가 있으면 그 앞에 새 메뉴 엔트리를 삽입할 수 없어요.
pathName invoke index — 메뉴 엔트리의 동작을 호출합니다. 자세한 내용은 위 개별 엔트리 섹션을 참조해요. 메뉴 엔트리가 disabled면 아무 일도 일어나지 않아요. 엔트리에 연결된 명령이 있으면 그 명령의 결과가 invoke 위젯 명령의 결과로 돌아옵니다. 아니면 빈 문자열이에요. 참고로 메뉴 엔트리를 호출해도 메뉴가 자동으로 언포스트되지는 않습니다. 기본 바인딩이 보통 invoke 위젯 명령을 호출하기 전에 이것을 처리해요.
pathName post x y ?index? — 메뉴가 x, y로 주어진 루트 창 좌표에 화면에 표시되도록 합니다. 인덱스를 지정하면 메뉴가 그 인덱스의 엔트리가 그 점에 표시되도록 위치합니다. 전체 메뉴가 화면에 보이도록 필요하면 좌표를 조정해요. 보통 빈 문자열을 돌려줍니다. -postcommand 옵션이 지정되면 메뉴를 포스트하기 전에 그 값을 Tcl 스크립트로 실행하고 그 결과를 post 위젯 명령의 결과로 돌려줍니다. 실행 중 오류가 반환되면 메뉴를 포스트하지 않고 오류를 반환해요.
pathName postcascade index — index로 주어진 캐스케이드 엔트리와 연결된 서브메뉴를 포스트하고, 이전에 포스트된 서브메뉴는 언포스트합니다. index가 캐스케이드 엔트리에 해당하지 않거나 pathName이 포스트되지 않았으면, 현재 포스트된 서브메뉴를 언포스트하는 것 외에는 효과가 없어요.
pathName type index — index로 주어진 메뉴 엔트리의 유형을 돌려줍니다. 엔트리 생성 시 add나 insert 위젯 명령에 전달된 type 인자(예: command, separator)나, tear-off 엔트리라면 tearoff를 돌려줘요.
pathName unpost — 더 이상 표시되지 않도록 창을 언맵합니다. 더 낮은 수준의 캐스케이드 메뉴가 포스트되어 있으면 그 메뉴를 언포스트해요. 빈 문자열을 돌려줍니다. 이 서브커맨드는 메뉴를 언포스트하는 자기 방식이 있는 Windows와 Macintosh에서는 동작하지 않아요.
pathName xposition index — index로 지정된 엔트리의 맨 왼쪽 픽셀의 메뉴 창 내 x 좌표를 나타내는 십진 문자열을 돌려줍니다.
pathName yposition index — index로 지정된 엔트리의 맨 위 픽셀의 메뉴 창 내 y 좌표를 나타내는 십진 문자열을 돌려줍니다.
메뉴 엔트리 옵션
메뉴 엔트리에 허용되는 옵션은 다음과 같습니다. 대부분의 옵션은 모든 엔트리 유형이 지원하지 않아요.
-activebackground value — 엔트리가 활성일 때 표시할 배경색. Aqua/macOS에서 무시됩니다. 빈 문자열(기본값)로 지정하면 전체 메뉴의 -activebackground 옵션을 사용해요. tk_strictMotif 변수가 엄격한 Motif 준수를 요청하도록 설정됐으면 이 옵션은 무시되고 -background 옵션이 그 자리를 대신합니다. separator나 tear-off 엔트리에는 사용할 수 없어요.
-activeforeground value — 엔트리가 활성일 때 표시할 전경색. Aqua/macOS에서 무시됩니다. 빈 문자열(기본값)이면 전체 메뉴의 -activeforeground를 사용해요. separator나 tear-off 엔트리에는 없어요.
-accelerator value — 메뉴 엔트리 오른쪽에 표시할 문자열을 지정합니다. 보통 메뉴 엔트리와 같은 기능을 호출하는 가속기 키 입력 시퀀스를 설명해요. 표시 옵션이며 실제 바인딩을 설정하지 않습니다(bind로 가능). separator나 tear-off 엔트리에는 없어요.
-background value — 엔트리가 normal 상태(활성도 disabled도 아님)일 때 표시할 배경색. Aqua/macOS에서 무시됩니다. 빈 문자열(기본값)이면 전체 메뉴의 -background를 사용해요. separator나 tear-off에는 없습니다.
-bitmap value — 텍스트 라벨 대신 메뉴에 표시할 비트맵을 Tk_GetBitmap이 받아들이는 형태 중 하나로 지정합니다. 이 옵션은 -label을 덮어쓰지만(-compound 옵션 제어) 빈 문자열로 재설정해 텍스트 라벨을 표시할 수 있어요. -image 옵션이 지정되면 -bitmap을 덮어씁니다. separator나 tear-off에는 없어요.
-columnbreak value — 0이면 엔트리가 이전 엔트리 아래에 나타나고, 1이면 메뉴의 새 열 맨 위에 나타납니다. 메뉴가 항상 단일 열인 Aqua/macOS에서는 무시돼요.
-command value — 메뉴 엔트리가 호출될 때 실행할 Tcl 명령을 지정합니다. separator나 tear-off에는 없어요.
-compound value — 메뉴 엔트리가 이미지와 텍스트를 둘 다 표시할지, 그렇다면 텍스트에 상대적으로 이미지를 어디에 둘지 지정합니다. 유효한 값은 bottom, center, left, none, right, top이고 기본값은 none으로, 버튼이 -image와 -bitmap 옵션 값에 따라 이미지나 텍스트 중 하나만 표시함을 뜻해요.
-font value — 이 엔트리에서 라벨이나 가속기 문자열을 그릴 때 사용할 글꼴을 지정합니다. 빈 문자열(기본값)이면 전체 메뉴의 -font를 사용해요. separator나 tear-off에는 없습니다.
-foreground value — 엔트리가 normal 상태일 때 표시할 전경색. Aqua/macOS에서 무시됩니다. 빈 문자열(기본값)이면 전체 메뉴의 -foreground를 사용해요. separator나 tear-off에는 없습니다.
-hidemargin value — 이 메뉴 엔트리에 표준 여백을 그릴지 지정합니다. 이미지가 든 팔레트(색 팔레트, 패턴 팔레트 등)를 만들 때 유용해요. 1이면 엔트리의 여백이 숨겨지고, 0이면 여백이 사용됩니다.
-image value — 텍스트 문자열이나 비트맵 대신 메뉴에 표시할 이미지를 지정합니다. 이미지는 이전 image create 호출로 만들어져 있어야 해요. 이 옵션은 -label과 -bitmap을 덮어쓰지만(-compound 제어) 빈 문자열로 재설정해 텍스트·비트맵 라벨을 표시할 수 있어요. separator나 tear-off에는 없습니다.
-indicatoron value — checkbutton과 radiobutton 엔트리에서만 사용 가능합니다. value는 indicator를 표시할지 여부를 정하는 불리언이에요.
-label value — 메뉴 엔트리에 식별 라벨로 표시할 문자열을 지정합니다. separator나 tear-off에는 없어요.
-menu value — cascade 엔트리에서만 사용 가능합니다. 이 엔트리와 연결된 서브메뉴의 경로 이름을 지정해요. 서브메뉴는 메뉴의 자식이어야 합니다.
-offvalue value — checkbutton 엔트리에서만 사용 가능합니다. 엔트리가 해제될 때 연관 변수에 저장할 값을 지정해요.
-onvalue value — checkbutton 엔트리에서만 사용 가능합니다. 엔트리가 선택될 때 연관 변수에 저장할 값을 지정해요.
-selectcolor value — checkbutton과 radiobutton 엔트리에서만 사용 가능합니다. 엔트리가 선택됐을 때 indicator에 표시할 색을 지정해요. 값이 빈 문자열(기본값)이면 메뉴의 -selectcolor 옵션이 indicator 색을 결정합니다.
-selectimage value — checkbutton과 radiobutton 엔트리에서만 사용 가능합니다. 엔트리가 선택됐을 때(-image 옵션 대신) 표시할 이미지를 지정합니다. value는 이전 image create 호출로 만들어져야 하는 이미지의 이름이에요. -image 옵션이 지정된 경우에만 적용됩니다.
-state value — 엔트리의 세 가지 상태 normal, active, disabled 중 하나를 지정합니다. normal 상태에서는 메뉴의 -foreground 옵션과 엔트리·메뉴의 -background 옵션으로 표시돼요. active 상태는 보통 포인터가 엔트리 위에 있을 때 쓰이며, 메뉴의 -activeforeground와 엔트리의 -activebackground 옵션으로 표시됩니다. disabled 상태는 엔트리가 반응하지 않아야 함을 뜻합니다. 기본 바인딩이 엔트리를 활성화·호출하는 걸 거부해요. 이 상태에서는 메뉴의 -disabledforeground와 엔트리의 -background 옵션으로 표시됩니다. separator 엔트리에는 사용할 수 없어요.
-underline value — 엔트리에서 밑줄 그을 문자의 정수 인덱스를 지정합니다. 기본 바인딩도 이 옵션을 조회해 키보드 탐색을 구현해요. 0이 엔트리에 표시된 텍스트의 첫 문자, 1이 다음 문자 등이에요. 엔트리에 비트맵이나 이미지가 표시되면 무시됩니다. separator나 tear-off에는 없어요.
-value value — radiobutton 엔트리에서만 사용 가능합니다. 엔트리가 선택될 때 연관 변수에 저장할 값을 지정해요. 빈 문자열을 지정하면 변수에 저장할 값으로 엔트리의 -label 옵션을 사용합니다.
-variable value — checkbutton과 radiobutton 엔트리에서만 사용 가능합니다. 엔트리가 선택될 때 설정할 전역 변수의 이름을 지정해요. checkbutton 엔트리에서는 해제될 때도 설정됩니다. radiobutton 엔트리에서는 변수를 바꾸면 현재 선택된 엔트리가 스스로 선택을 해제하게 합니다.
checkbutton 엔트리의 경우 이 옵션의 기본값은 -label 옵션에서 가져오고, radiobutton 엔트리의 경우 단일 고정 값이 사용됩니다. checkbutton이나 radiobutton을 만들 때는 항상 -variable 옵션을 설정하는 것이 좋아요.
메뉴 구성
기본 바인딩은 메뉴를 사용하는 네 가지 방식을 지원합니다.
메뉴바의 풀다운 메뉴 — 가장 흔한 경우입니다. 메뉴바가 될 메뉴 위젯을 만들고, 이 메뉴에 메뉴바에서 쓰려는 풀다운 메뉴를 지정하는 cascade 엔트리를 추가한 뒤 모든 풀다운을 만듭니다. 그런 다음 toplevel 위젯 명령의 -menu 옵션으로 메뉴를 지정해요. 자세한 내용은 toplevel 매뉴얼 항목을 참조하세요.
메뉴 버튼의 풀다운 메뉴 — 메뉴바를 만드는 호환 방식입니다. 각 최상위 메뉴에 대해 menubutton 위젯 하나씩 만들고, 보통 메뉴바 창에 menubutton들을 한 줄로 배열해요. 최상위 메뉴와 캐스케이드 서브메뉴도 만들고, menubutton과 cascade 메뉴 엔트리의 -menu 옵션으로 서로 연결합니다. 최상위 메뉴는 menubutton의 자식이어야 하고, 각 서브메뉴는 그걸 가리키는 메뉴의 자식이어야 해요. 그다음 기본 바인딩이 사용자로 하여금 menubutton을 통해 메뉴 트리를 탐색하고 호출할 수 있게 합니다.
팝업 메뉴 — 팝업 메뉴는 보통 마우스 버튼 누름이나 키 입력에 대한 응답으로 포스트됩니다. 팝업 메뉴와 캐스케이드 서브메뉴를 만든 뒤, 적절한 시점에 tk_popup 절차를 호출해 최상위 메뉴를 포스트합니다.
옵션 메뉴 — 옵션 메뉴는 여러 값 중 하나를 고르게 하는 연관 메뉴가 든 menubutton으로 구성됩니다. 현재 값은 menubutton에 표시되고 전역 변수에도 저장돼요. tk_optionMenu 절차로 옵션 menubutton과 그 메뉴를 만듭니다.
티어오프 메뉴 — 기존 메뉴 맨 위의 tear-off 엔트리를 호출해 torn-off 메뉴를 만듭니다. 기본 바인딩이 원본 메뉴의 복사본인 새 메뉴를 만들고 최상위 창으로 영구히 포스트된 채 남겨요. torn-off 메뉴는 원본 메뉴와 똑같이 동작합니다.
기본 바인딩
Tk는 메뉴에 다음 기본 동작을 주는 클래스 바인딩을 자동으로 만듭니다.
- 마우스가 메뉴에 들어오면 마우스 커서 아래의 엔트리가 활성화됩니다. 마우스가 메뉴 안에서 움직이면 활성 엔트리가 마우스를 따라 바뀌어요.
- 마우스가 메뉴를 떠나면 모든 엔트리가 비활성화됩니다. 단, 마우스가 메뉴에서 캐스케이드 서브메뉴로 이동하는 특수 경우는 예외예요.
- 메뉴 위에서 버튼을 놓으면 활성 엔트리(있으면)가 호출됩니다. 메뉴도 torn-off 메뉴가 아니라면 언포스트됩니다.
- Space와 Return 키가 활성 엔트리를 호출하고 메뉴를 언포스트합니다.
- 메뉴의 어떤 엔트리든
-underline옵션으로 밑줄 친 문자가 있으면, 그 밑줄 문자(또는 대소문자 동등물)를 누르면 해당 엔트리를 호출하고 메뉴를 언포스트합니다. - Escape 키는 어떤 엔트리도 호출하지 않고 진행 중인 메뉴 선택을 중단합니다. torn-off 메뉴가 아니라면 메뉴도 언포스트해요.
- Up과 Down 키가 메뉴에서 다음으로 높거나 낮은 엔트리를 활성화합니다. 메뉴의 한쪽 끝에 도달하면 활성 엔트리가 반대쪽 끝으로 감깁니다.
- Left 키가 왼쪽의 다음 메뉴로 이동합니다. 현재 메뉴가 캐스케이드 서브메뉴면 서브메뉴가 언포스트되고 현재 메뉴 엔트리가 부모의 캐스케이드 엔트리가 됩니다. 현재 메뉴가 menubutton에서 포스트된 최상위 메뉴면 현재 menubutton이 언포스트되고 왼쪽의 다음 menubutton이 포스트됩니다. 그 외에는 효과가 없어요. menubutton의 왼쪽-오른쪽 순서는 쌓임 순서로 결정됩니다. Tk는 가장 낮은 menubutton(기본적으로 첫 번째로 만들어진 것)이 왼쪽에 있다고 가정해요.
- Right 키가 오른쪽의 다음 메뉴로 이동합니다. 현재 엔트리가 cascade 엔트리면 서브메뉴가 포스트되고 현재 메뉴 엔트리가 서브메뉴의 첫 엔트리가 됩니다. 아니면, 현재 메뉴가 menubutton에서 포스트됐다면 현재 menubutton이 언포스트되고 오른쪽의 다음 menubutton이 포스트됩니다.
disabled 메뉴 엔트리는 반응하지 않습니다. 활성화되지 않고 마우스 버튼 누름과 놓음을 무시해요.
여러 바인딩은 tk_menuSetFocus 명령을 사용합니다. 현재 포커스를 저장하고 그 pathName 인자(메뉴 위젯)로 포커스를 설정해요.
메뉴의 동작은 개별 위젯에 새 바인딩을 정의하거나 클래스 바인딩을 재정의해 바꿀 수 있습니다.
알려진 버그
현재 옵션 데이터베이스를 사용해 개별 엔트리의 옵션 값들을 지정하는 것은 불가능해요.
더 알아보기
- bind — 이벤트 바인딩
- menubutton — 메뉴 버튼 위젯
- toplevel — 최상위 창
- ttk::menubutton — 테마 기반 메뉴 버튼 위젯