`checkbutton` — 체크버튼(boolean 선택) 위젯 만들기
checkbutton — 체크버튼(boolean 선택) 위젯 만들기
켜고 끄는 스위치 하나가 필요할 때, 그리고 여러 항목 중 몇 개를 동시에 고를 때 쓰는 게 체크버튼이에요. 일반 버튼처럼 눌리는 동작을 하면서도, 선택 여부를 기억해서 화면의 체크 표시와 Tcl 변수 값이 알아서 따라 와요.
본문
시그니처
checkbutton pathName ?options?
checkbutton 명령은 pathName이라는 새 창을 만들어 체크버튼 위젯으로 만들어 줘요. 호출 시점에 pathName이라는 창이 없어야 하고, pathName의 부모는 이미 존재해야 해요. 명령은 pathName을 돌려줘요.
체크버튼은 텍스트 문자열·비트맵·이미지와 함께 인디케이터(indicator)라는 사각형을 보여주는 위젯이에요. 텍스트는 한 가지 폰트로만 그려지지만, 개행 문자나 -wraplength로 인해 여러 줄이 될 수 있고, -underline로 문자 하나에 밑줄을 그을 수 있어요.
체크버튼은 일반 버튼의 동작을 모두 가져요. -state에 따라 세 가지 모습으로 보이고, raised·sunken·flat 중 하나로 나타나며, 깜빡임도 가능하고, 체크버튼 위에서 마우스 1번 버튼을 클릭하면 Tcl 명령을 호출해요.
여기에 더해 체크버튼은 선택(selected) 될 수 있어요. 선택되면 인디케이터가 선택된 모양(안에 체크 표시)으로 그려지고, 연결된 Tcl 변수가 특정 값(보통 1)으로 설정돼요. 선택되지 않으면 인디케이터가 선택되지 않은 모양(체크 표시 없음)으로 그려지고 변수는 다른 값(보통 0)으로 설정돼요. 특별한 경우로, (지정된) 변수 값이 tristatevalue와 일치하면 인디케이터가 tri-state 모양으로 그려지며 혼합·다중 값을 나타내요(여러 항목의 상태를 하나의 체크박스로 표현할 때 써요).
인디케이터는 플랫폼에 따라 다르게 그려져요. Unix와 Windows에서는 박스 내부가 "회색(grayed)"으로 처리되고, Mac에서는 안에 대시(dash) 표시가 그려져요.
기본적으로 체크버튼과 연결된 변수 이름은 체크버튼을 만들 때 쓴 이름과 같아요. 변수 이름과 그 안에 저장되는 "on", "off", "tristate" 값을 명령줄이나 옵션 데이터베이스에서 바꿀 수 있어요. 기본적으로 체크버튼은 번갈아 클릭할 때마다 스스로 선택·해제돼요. 또 각 체크버튼은 연결된 변수를 감시해서, 변수 값이 버튼의 "on", "off", "tristate" 값으로 바뀌면 자동으로 선택·해제돼요.
표준 옵션
-activebackground, activeBackground, Foreground
-activeforeground, activeForeground, Background
-anchor, anchor, Anchor
-background or -bg, background, Background
-bitmap, bitmap, Bitmap
-borderwidth or -bd, borderWidth, BorderWidth
-compound, compound, Compound
-cursor, cursor, Cursor
-disabledforeground, disabledForeground, DisabledForeground
-font, font, Font
-foreground or -fg, foreground, Foreground
-highlightbackground, highlightBackground, HighlightBackground
-highlightcolor, highlightColor, HighlightColor
-highlightthickness, highlightThickness, HighlightThickness
-image, image, Image
-justify, justify, Justify
-padx, padX, Pad
-pady, padY, Pad
-relief, relief, Relief
-takefocus, takeFocus, TakeFocus
-text, text, Text
-textvariable, textVariable, Variable
-underline, underline, Underline
-wraplength, wrapLength, WrapLength
위젯 전용 옵션
-command — 버튼과 연결할 Tcl 명령을 지정해요. 마우스 1번 버튼을 버튼 위에서 뗄 때 호출되며, 명령이 호출되기 전에 버튼의 전역 변수(-variable 옵션)가 먼저 갱신돼요.
-height — 버튼에 원하는 높이를 지정해요. 이미지·비트맵이면 화면 단위, 텍스트면 줄 수로 해석돼요. 지정하지 않으면 표시 내용 크기로부터 자동 계산돼요.
-indicatoron — 인디케이터를 그릴지 여부를 지정해요. 올바른 boolean 값이어야 해요. false면 -relief 옵션이 무시되고, 위젯이 선택되면 항상 sunken, 그렇지 않으면 raised로 그려져요.
-offrelief — 인디케이터를 그리지 않고 체크버튼이 off일 때 쓸 relief예요. 기본값은 "raised"예요. 이 옵션을 "flat"으로, -indicatoron을 false로, -overrelief를 "raised"로 설정하면, 평평하다가 마우스를 올리면 올라오고 활성화되면 눌리는 버튼 효과를 얻을 수 있어요. 워드프로세서 툴바의 Bold·Italic·Underline 체크버튼이 이런 동작을 보여줘요.
-offvalue — 이 버튼이 선택 해제될 때 연결된 변수에 저장할 값을 지정해요. 기본값은 "0"이에요.
-onvalue — 이 버튼이 선택될 때 연결된 변수에 저장할 값을 지정해요. 기본값은 "1"이에요.
-overrelief — 마우스 커서가 위젯 위에 있을 때 쓸 대체 relief예요. 툴바 버튼을 만들 때 -relief flat -overrelief raised처럼 써요. 값이 빈 문자열(기본값)이면 대체 relief를 쓰지 않아요.
-selectcolor — 버튼이 선택됐을 때 쓸 배경색을 지정해요. indicatorOn이 true면 이 색이 선택 상태와 무관하게 항상 인디케이터의 배경으로 쓰여요. false면 위젯이 선택될 때마다 background나 activeBackground 대신 위젯 전체의 배경으로 사용돼요. 빈 문자열로 지정하면 선택 시 특별한 색을 쓰지 않아요.
-selectimage — 체크버튼이 선택됐을 때(-image 옵션 대신) 보여줄 이미지를 지정해요. -image 옵션이 지정돼 있지 않으면 무시돼요.
-state — 체크버튼의 세 가지 상태 중 하나를 지정해요: normal, active, disabled. normal은 -foreground·-background로, active(주로 포인터가 위에 있을 때)는 -activeforeground·-activebackground로 표시돼요. disabled는 위젯을 무감각하게 만들어 기본 바인딩이 활성화를 거부하고 마우스 누름을 무시해요. 이 상태에서는 -disabledforeground·-background로 표시돼요.
-tristateimage — 체크버튼이 tri-state 모드일 때(-image 대신) 보여줄 이미지를 지정해요. -image 옵션이 지정돼 있지 않으면 무시돼요.
-tristatevalue — 체크버튼이 다중 값 선택(tri-state 모드)으로 표시되게 하는 값을 지정해요. 기본값은 ""이에요.
-variable — 이 버튼이 선택됐는지 나타내기 위해 설정할 전역 변수의 이름을 지정해요. 기본값은 부모 내에서의 버튼 이름(버튼 창 path name의 마지막 요소)이에요.
-width — 버튼에 원하는 폭을 지정해요. 이미지·비트맵이면 화면 단위, 텍스트면 문자 수로 해석돼요. 지정하지 않으면 표시 내용 크기로부터 자동 계산돼요.
위젯 명령
checkbutton 명령은 pathName이라는 새 Tcl 명령을 만들어요. 일반 형태는 다음과 같아요.
pathName option ?arg arg ...?
가능한 하위 명령은 다음과 같아요.
pathName cget option— 설정 옵션의 현재 값을 돌려줘요.pathName configure ?option? ?value option value ...?— 설정 옵션을 조회하거나 바꿔요. 옵션 없이 호출하면 전체 옵션 목록, 값 없는 옵션 하나는 그 옵션 설명을 돌려주고, 옵션-값 쌍을 주면 해당 옵션을 바꾼 뒤 빈 문자열을 돌려줘요.pathName deselect— 체크버튼을 선택 해제하고 연결 변수를 "off" 값으로 설정해요.pathName flash— 체크버튼을 깜빡여요. active와 normal 색을 번갈아 여러 번 다시 그려요. 상태가disabled면 무시돼요.pathName invoke— 사용자가 마우스로 체크버튼을 호출했을 때와 똑같이 동작해요: 버튼의 선택 상태를 토글하고 연결된 Tcl 명령(있으면)을 호출해요. 연결된 명령이 없으면 빈 문자열을 돌려줘요. 상태가disabled면 무시돼요.pathName select— 체크버튼을 선택하고 연결 변수를 "on" 값으로 설정해요.pathName toggle— 버튼의 선택 상태를 토글하고 다시 그려 연결 변수를 새 상태에 맞게 바꿔요.
바인딩
Tk는 체크버튼에 아래 기본 동작을 주는 클래스 바인딩을 자동으로 만들어요.
- Unix에서는 마우스가 체크버튼을 지나가면 활성화되고 떠나면 비활성화돼요. Mac과 Windows에서는 마우스 1번 버튼을 체크버튼 위에서 누르면, 포인터가 버튼 안에 있는 동안 활성화되고 버튼을 떠나면 비활성화돼요.
- 마우스 1번 버튼을 체크버튼 위에서 누르면 호출돼요(선택 상태가 토글되고 연결 명령이 있으면 호출돼요).
- 체크버튼이 입력 포커스를 가진 상태에서 스페이스 키를 누르면 호출돼요. Windows에서는 추가 키 바인딩이 있어서, plus(
+)와 equal(=)이 버튼을 선택하고 minus(-)가 해제해요.
상태가 disabled면 위 동작이 모두 일어나지 않아요. 위젯별 또는 클래스 바인딩을 다시 정의해 동작을 바꿀 수 있어요.
예제
서로 연결되지 않은 체크버튼 묶음 예제예요.
labelframe .lbl -text "Steps:"
checkbutton .c1 -text Lights -variable lights
checkbutton .c2 -text Cameras -variable cameras
checkbutton .c3 -text Action! -variable action
pack .c1 .c2 .c3 -in .lbl
pack .lbl
더 알아보기
button, options, radiobutton, ttk::checkbutton 문서를 함께 보면 버튼 계열 위젯을 한 번에 파악할 수 있어요.