`button` — 버튼(action) 위젯 만들기

button — 버튼(action) 위젯 만들기

GUI에서 어떤 행동을 일으키는 가장 기본적인 요소가 버튼이에요. 클릭하면 넣어 둔 명령이 실행되게 만들 수 있고, 살짝 눌린 듯한 테두리 효과까지 플랫폼이 알아서 처리해 줘서 실제로 코드는 아주 짧아요.

출처: Tcl/Tk Manual — button

본문

시그니처

button pathName ?options?

button 명령은 pathName이라는 새 창을 만들어 버튼 위젯으로 만들어 줘요. 호출 시점에는 pathName이라는 이름의 창이 없어야 하고, pathName의 부모는 이미 존재해야 해요. 명령은 pathName을 그대로 돌려줘요.

버튼은 텍스트 문자열·비트맵·이미지 중 하나를 보여주는 위젯이에요. 텍스트를 보여줄 때는 한 가지 폰트로만 그려야 하지만, 개행 문자가 있거나 -wraplength 때문에 줄바꿈이 생기면 화면에서 여러 줄로 늘어날 수 있어요. -underline 옵션으로 문자 하나에 밑줄을 그을 수도 있어요.

버튼은 -state 옵션에 따라 세 가지 모습으로 보이고, raised·sunken·flat 중 한 형태로 나타나며, 깜빡임(flash)도 가능해요. 사용자가 버튼 위에 커서를 올린 채 마우스 1번 버튼을 누르면 -command 옵션에 지정한 Tcl 명령이 호출돼요.

표준 옵션

다른 위젯과 공유하는 표준 옵션 목록이에요. 각 옵션은 -명령줄이름, 데이터베이스이름, 클래스 형태로 되어 있어요.

-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
-repeatdelay, repeatDelay, RepeatDelay
-repeatinterval, repeatInterval, RepeatInterval
-takefocus, takeFocus, TakeFocus
-text, text, Text
-textvariable, textVariable, Variable
-underline, underline, Underline
-wraplength, wrapLength, WrapLength

위젯 전용 옵션

-command — 버튼과 연결할 Tcl 명령을 지정해요. 주로 마우스 1번 버튼을 버튼 위에서 뗄 때 호출돼요.

-default — 기본 버튼 링(ring)의 세 가지 상태 중 하나를 지정해요: normal, active, disabled. active 상태에서는 플랫폼별 기본 버튼 모양으로 그려져요. normal 상태에서는 기본 버튼이 아닌 모양으로 그려지되 기본 버튼 모양을 그릴 공간을 남겨 둬요. 그래서 normalactive는 같은 크기의 버튼이 돼요. disabled 상태에서는 기본 모양 공간을 남기지 않고 그려져서 active보다 작은 버튼이 될 수 있어요.

-height — 버튼에 원하는 높이를 지정해요. 이미지나 비트맵을 보여줄 때는 화면 단위(스크린 유닛, Tk_GetPixels가 받아들이는 형태), 텍스트일 때는 텍스트 줄 수로 해석돼요. 지정하지 않으면 표시하는 이미지·비트맵·텍스트 크기로부터 자동 계산돼요.

-overrelief — 마우스 커서가 위젯 위에 있을 때 쓸 대체 relief를 지정해요. 툴바 버튼을 만들 때 -relief flat -overrelief raised처럼 쓰면 돼요. 값이 빈 문자열(기본값)이면 커서가 위에 있어도 대체 relief를 쓰지 않아요.

-state — 버튼의 세 가지 상태 중 하나를 지정해요: normal, active, disabled. normal 상태에서는 -foreground-background 옵션으로 표시되고, active 상태(주로 포인터가 버튼 위에 있을 때)는 -activeforeground-activebackground 옵션으로 표시돼요. disabled 상태는 버튼을 무감각(insensitive)하게 만들어서 기본 바인딩이 위젯을 활성화하지 않고 마우스 버튼 누름을 무시해요. 이 상태에서는 -disabledforeground-background 옵션으로 표시돼요.

-width — 버튼에 원하는 폭을 지정해요. 이미지·비트맵이면 화면 단위, 텍스트 버튼(이미지가 없거나 -compound none)이면 텍스트 라벨에 할당할 문자 수로 해석돼요. 음수면 최소 폭을 의미해요. 지정하지 않으면 표시 내용 크기로부터 자동 계산돼요.

위젯 명령

button 명령은 pathName이라는 이름의 새 Tcl 명령을 만들어요. 일반적인 형태는 다음과 같아요.

pathName option ?arg ...?

가능한 하위 명령은 다음과 같아요.

  • pathName cget optionoption 설정 옵션의 현재 값을 돌려줘요.
  • pathName configure ?option? ?value option value ...? — 위젯의 설정 옵션을 조회하거나 바꿔요. 옵션 없이 호출하면 사용 가능한 전체 옵션 목록을 돌려주고, 값 없는 옵션 하나를 주면 그 옵션 설명 목록을 돌려줘요. 하나 이상의 옵션-값 쌍을 주면 해당 옵션들을 그 값으로 바꾸고 빈 문자열을 돌려줘요.
  • pathName flash — 버튼을 깜빡여요. 설정된 activebackgroundbackground 색을 번갈아 가며 여러 번 다시 그리는 방식이에요. 끝나면 호출 시점과 같은 normal/active 상태로 남아요. 상태가 disabled면 무시돼요.
  • pathName invoke — 버튼과 연결된 Tcl 명령을 호출해요. 연결된 명령이 없으면 빈 문자열을 돌려줘요. 상태가 disabled면 무시돼요.

기본 바인딩

Tk는 버튼에 기본 동작을 주는 클래스 바인딩을 자동으로 만들어요.

  • 마우스가 버튼 위에 있으면 활성화되고 떠나면 비활성화돼요. Windows에서는 이 바인딩이 마우스 1번 버튼을 버튼 위에서 누른 동안만 동작해요.
  • 마우스 1번 버튼을 버튼 위에서 누르면 relief가 sunken으로 바뀌고, 나중에 1번 버튼을 떼면 원래 값으로 되돌아와요.
  • 마우스 1번 버튼을 버튼 위에서 누르고 같은 곳에서 떼면 버튼이 호출돼요. 떼는 시점에 마우스가 버튼 위가 아니면 호출되지 않아요.
  • 버튼이 입력 포커스를 가진 상태에서 스페이스 키를 누르면 버튼이 호출돼요.

상태가 disabled면 위 동작이 모두 일어나지 않아요. 위젯별로 새 바인딩을 정의하거나 클래스 바인딩을 다시 정의해 버튼 동작을 바꿀 수 있어요.

플랫폼 참고

Aqua/macOS에서는 플랫폼 지침과 충돌하기 때문에 일부 설정 옵션이 위젯 그리기에 반영되지 않아요. configurecget 하위 명령으로 값을 조작할 수는 있지만 위젯 모양은 변하지 않아요. 특히 -background-relief가 여기에 해당해요.

예제

클래식한 Tk "Hello, World!" 데모예요.

button .b -text "Hello, World!" -command exit
pack .b

버튼 가속기(accelerator)를 다루는 예제예요.

button .b1 -text Hello -underline 0
button .b2 -text World -underline 0
bind . <Key-h> {.b1 flash; .b1 invoke}
bind . <Key-w> {.b2 flash; .b2 invoke}
pack .b1 .b2

더 알아보기

ttk::button 위젯도 함께 살펴보면 테마(신형 스타일) 버튼이 필요할 때 도움이 돼요. bind, options, pack 위젯에 대한 문서도 참고하세요.