bindtags — 윈도우에 적용되는 바인딩과 평가 순서 결정하기

bindtags — 윈도우에 적용되는 바인딩과 평가 순서 결정하기

어떤 윈도우에 어떤 이벤트 바인딩이 적용되고, 여러 개가 걸릴 때 어느 순서로 실행되는지를 다루는 명령어가 bindtags예요. bind으로 바인딩을 만들 때 윈도우 이름, 클래스 이름, all 키워드 같은 문자열에 바인딩이 걸리는데, 이걸 통틀어 binding tag라고 불러요. 각 윈도우는 이 태그들의 리스트를 갖고 있고, 순서를 바꾸거나 태그를 추가·제거하고 싶을 때 bindtags를 써요.

출처: 문서

본문

문법

bindtags window ?tagList?

bind 명령어로 바인딩을 만들 때, 그 바인딩은 .a.b.c 같은 특정 윈도우, Button 같은 클래스 이름, all 키워드, 또는 그 외의 임의의 문자열과 연결돼요. 이 모든 형태를 통틀어 binding tag(바인딩 태그)라고 불러요.

각 윈도우에는 그 윈도우에 대해 이벤트가 어떻게 처리되는지 결정하는 binding tag의 리스트가 들어 있어요. 윈도우에서 이벤트가 발생하면, 그 이벤트는 윈도우의 각 태그에 순서대로 적용돼요. 각 태그에 대해, 그 태그와 이벤트에 매칭되는 가장 구체적인 바인딩이 실행돼요. 매칭 과정에 대한 자세한 내용은 bind 명령어를 참조하세요.

기본적으로 각 윈도우는 네 개의 binding tag를 가지는데, 순서대로 윈도우 이름, 윈도우의 클래스 이름, 윈도우에서 가장 가까운 toplevel 조상의 이름, all이에요. Toplevel 윈도우는 기본적으로 태그가 세 개뿐이에요(toplevel 이름이 윈도우 이름과 같으니까요).

bindtags 명령어는 윈도우의 binding tag를 읽고 수정할 수 있게 해줘요.

  • bindtags를 인자 하나로만 호출하면 window의 현재 binding tag 집합을 리스트로 반환해요.
  • tagList 인자를 지정하면 그것은 올바른 리스트여야 해요. window의 태그는 그 리스트의 원소들로 바뀌어요.

tagList의 원소는 임의의 문자열일 수 있어요. 다만 점(dot)으로 시작하는 태그는 윈도우 이름으로 취급되고, 이벤트가 처리될 시점에 그 이름의 윈도우가 존재하지 않으면 그 태그는 그 이벤트에 대해 무시돼요.

tagList 원소의 순서는 이벤트에 응답해 binding script가 실행되는 순서를 결정해요. 예를 들어 명령어

bindtags .b {all . Button .b}

.b라는 버튼에 대한 binding script가 평가되는 순서를 뒤집어, all 바인딩이 먼저 호출되고, 이어서 .b의 toplevel(.) 바인딩, 클래스 바인딩, 마지막으로 .b의 바인딩이 호출되게 해요.

tagList가 빈 리스트이면 window의 binding tag는 위에서 설명한 기본 상태로 돌아가요.

bindtags 명령어는 윈도우에 임의의 추가 binding tag를 도입하거나 표준 태그를 제거하는 데도 쓸 수 있어요. 예를 들어 명령어

bindtags .b {.b TrickyButton . all}

.bButton 태그를 TrickyButton으로 바꿔요. 이 뜻은 Button 태그에 연결된 버튼용 기본 위젯 바인딩이 더 이상 .b에 적용되지 않지만, TrickyButton에 연결된 어떤 바인딩(아마 어떤 새 버튼 동작)은 적용된다는 거예요.

예제

중첩된 frame 위젯 집합이 있고, 버튼 위젯으로 보내진 이벤트가 (Tk 기본 동작과 달리 이벤트가 중간 윈도우로 전달되지 않는 것과는 대조적으로) 현재 toplevel까지의 모든 위젯에도 전달되길 원한다면, 창의 일부에서만 활성화되는 가속기(accelerator)를 만들기 쉽도록 이렇게 도우미 프로시저로 설정할 수 있어요:

proc setupBindtagsForTreeDelivery {widget} {
    set tags [list $widget [winfo class $widget]]
    set w $widget
    set t [winfo toplevel $w]
    while {$w ne $t} {
        set w [winfo parent $w]
        lappend tags $w
    }
    lappend tags all
    bindtags $widget $tags
}

더 알아보기

  • bind — 이벤트 바인딩 명령어
  • 관련 키워드: binding, event, tag