본문으로 바로가기

Tk의 스핀박스 (spinbox)

category 카테고리 없음 2025. 9. 8. 13:51

스핀박스(spinbox)는 엔트리(entry) 위젯을 확장한 위젯입니다. 스핀박스는 엔트리의 오른쪽에 위/아래 버튼이 붙어 있어서, 엔트리에서 값을 직접 입력할 뿐만 아니라 위아래 버튼을 눌러 값을 선택할 수도 있습니다.

spinbox 생성

스핀박스는 spinbox 커맨드로 생성합니다.

spinbox 위젯명 옵션

 

주요 옵션은 다음과 같습니다.

  • -from n -to m -increment i
    선택할 수 있는 숫자 범위를 n에서 m까지로 설정합니다. 버튼을 눌렀을 때의 증가값은 i입니다. i가 부동소수점일 경우, 표시도 부동소수점이 됩니다.
  • -format 서식 문자열 
    선택하는 숫자가 부동소수점일 경우, 표시 방법을 서식 문자열로 지정합니다. 서식은 Tcl의 커맨드 format의 %f와 같습니다.
  • -value 리스트  
    선택할 항목을 리스트로 설정합니다.
  • -state 상태  
    스핀박스의 상태(normal, readonly, disabled)를 설정합니다.

숫자는 옵션 -from n -to m -increment i로 간단하게 설정할 수 있습니다. 숫자가 부동소수점일 경우, 옵션 -format으로 표시 방법을 설정할 수 있습니다. 숫자가 아닌 경우에는 옵션 -value를 사용합니다. 항목을 리스트에 담아 -value에 설정합니다. -state를 readonly로 하면 엔트리에서의 입력이 금지되고 버튼만으로 값을 선택하게 됩니다.

그럼 간단한 사용 예를 보여드리겠습니다. 다음 리스트를 보세요.

spinbox .s1 -from 1 -to 10 -increment 1 -width 10  
spinbox .s2 -from 1 -to 5 -increment 0.5 -width 10 -format %05.2f  
spinbox .s3 -value {apple banana cherry grape orange} -width 10 -state readonly  

pack .s1 .s2 .s3 -padx 5 -pady 5

스핀박스를 3개 만듭니다. .s1은 1에서 10까지의 숫자로, -increment는 1입니다. .s2는 1에서 5까지의 숫자지만, -increment가 0.5이므로 부동소수점으로 표시됩니다. -format의 지정이 %05.2f이므로 표시는 01.50과 같이 됩니다. .s3은 apple, banana, cherry, grape, orange 중에서 선택합니다. -state에 readonly를 지정했으므로 엔트리로 입력할 수 없습니다.

그럼 실행 결과를 보여드리겠습니다.

 

(1) (2) (3)

 

(1)은 실행 직후의 상태입니다. (2)는 업 버튼을 한 번 누른 상태입니다. 한 번 더 업 버튼을 누르면 (3)의 상태가 됩니다.

입력 데이터 확인  

엔트리 위젯에는 validation이라는 입력 데이터를 확인하는 기능이 있습니다. 스핀박스에서도 validation을 사용할 수 있습니다. validation 설정은 옵션 -validate와 -validatecommand(-vcmd)로 합니다. 옵션 -validate는 입력 데이터를 확인하는 타이밍을 지정합니다. 타이밍 종류는 다음과 같습니다. 

 

옵션 -validate의 값
none validation을 하지 않음(기본값)
focus 입력 포커스를 얻거나 잃었을 때
focusin 입력 포커스를 얻었을 때
focusout 입력 포커스를 잃었을 때
key 키가 입력되었을 때
all 위 조건을 모두 만족했을 때

 

-validate로 지정한 조건을 만족했을 때, -vcmd로 지정한 커맨드를 실행하여 입력 데이터를 확인합니다. -vcmd에는 참 또는 거짓을 반환하는 커맨드를 지정하세요. 커맨드가 참을 반환하면 엔트리의 내용이 갱신됩니다. 커맨드가 거짓을 반환하면 엔트리의 내용은 변경되지 않습니다. 이때, 옵션 -invalidcommand에 커맨드가 설정되어 있다면 그 커맨드가 실행됩니다.

-vcmd와 -invalidcommand로 지정한 커맨드 내에서는 위젯 내 정보를 얻기 위한 방법이 준비되어 있습니다. %로 시작하는 문자열은 위젯 내 정보로 치환됩니다. 체크할 데이터는 %P로 얻을 수 있습니다. 그 밖의 정보는 Tcl/Tk의 도움말을 참조하세요.

그럼 간단한 사용 예를 보여드리겠습니다.

spinbox .s1 -from 1 -to 10 -increment 1 -width 10 \
            -validate key -vcmd {string is integer %P}
spinbox .s2 -value {apple banana cherry grape orange} -width 10 \
            -validate key -vcmd {expr {[string length %P] <= 8}}

pack .s1 .s2 -padx 5 -pady 5

스핀박스 .s1처럼 숫자를 입력하는 경우, 데이터가 숫자인지 확인해두면 편리합니다. 데이터 체크는 Tcl의 커맨드 string을 사용하면 간단합니다. string is class data는 인수 data가 문자 클래스 class로 구성되어 있는지 체크합니다. 문자 클래스란 문자의 종류입니다. 숫자인지 판정할 경우 integer를 지정합니다.

-validate에는 key를 지정합니다. 이는 엔트리에서의 키 입력에도 대응합니다. 키 입력이 있을 때마다 string is integer로 데이터를 체크하므로 숫자를 나타내는 문자 이외에는 입력할 수 없습니다.

스핀박스 .s2는 데이터 길이를 string length로 체크합니다. 이로써 8문자보다 긴 데이터를 입력할 수 없습니다.