Programming/TclTk

TK X 이벤트와 Tcl 명령의 연결

Hunveloper 2022. 9. 13. 10:41
728x90

X 이벤트와 Tcl 명령의 연결

  • 바인딩은 Tcl 명령을 X 윈도우 시스템의 이벤트와 연결시키는 작업
  • 이벤트는 다음과 같은 경우에 발생
    • 키가 눌려진 경우
    • 키에서 손을 뗀 경우
    • 마우스 버튼이 눌려진 경우
    • 마우스 버튼을 놓은 경우
    • 윈도우 안으로 마우스 포인터가 들어가는 경우
    • 마우스 포인터가 윈도우 밖으로 빠져 나가는 경우
    • 윈도우의 크기가 변경되는 경우
    • 윈도우가 열리는 경우
    • 윈도우가 닫히는 경우
    • 입력 포커스를 얻은 경우
    • widget이 없어지는 경우
  • 바인딩은 binding tag들로 정의되며 각 widget은 binding tage들의 집합과 연결
  • 바인딩과 widget이 분리됨으로써 유연하고 강력한 시스템을 구성할 수 있음

bind 명령

  • bind 명령은 현재 바인딩에 대한 정보를 돌려 주고 새로운 바인딩을 정의하는 데 사용
  • bind 명령의 문법
bind bindingTag ?eventSequence? ?command?
  • bindingTag는 주로 widget 클래스 이름이거나 widget 인스턴스 이름
  • 하나의 파라미터만 주는 경우 명령 바인딩이 설정된 이벤트들을 반환
bind Menubutton
=> <Key-space> <ButtonRelease-1> <B1-Motion> <Motion> <Button-1> <Leave> <Enter>
  • 은 왼쪽 마우스 버튼을 클릭하는 경우 발생
  • 은 왼쪽 마우스 버튼을 클릭한 채로 마우스를 움직이는 경우 발생
  • 명령어의 바인딩은 이와 같은 이벤트의 나열에 대해 정의
  • bind 명령에 eventSequence 파라미터를 주면 그 이벤트에 연결된 명령을 보여줌
  • 이벤트 바인딩을 위해 사용되는 Tcl 명령은 이벤트 키워드를 위한 몇 가지 추가적인 문법을 제공
  • 이러한 키워드는 ‘%’로 시작하며, 이벤트와 관련된 데이터로 대체
  • %W는 widget의 경로명으로 대치
  • %X와 %Y 키워드는 이벤트 발생 좌표로 대치
  • %는 인용 부호에 상관없이 항상 치환
  • % 기호를 사용하기 위해서는 %%로 사용
  • 이러한 이유로 바인딩 명령은 프로시져를 호출하는 방법으로 짧게 만드는 것이 좋음
  • 새로운 바인딩은 연속된 일련의 이벤트와 명령을 줌으로써 정의됨
bind Menubutton <B1-Motion> {tkMbMotion %W down %X %Y}
  • 바인딩 명령의 처음이 ‘+’ 기호로 시작하면 그 명령은 바인딩 명령에 추가
bind bindingTag event {+ command args}
  • 이벤트에 대한 바인딩을 삭제하기 위해서는 이벤트를 빈 스트링과 연결
bind bindingTag event { }
  • bind 명령은 실행 전체에 걸쳐 영향을 미침

bindtags 명령

  • 바인딩은 관련 바인딩을 묶는 binding tag와 연결
  • 각 widget은 binding tag의 집합과 연결
  • bindtags 명령은 widget의 binding tag를 제어
  • bindtags 명령의 문법
bindtags widget ?tagList?
  • 다음 명령은 text widget에 대한 기본 binding tag를 반환
bindtags .t => .t Text . all
  • 모든 Tk widget은 기본적으로 다음과 같은 4개의 binding tag를 가지고 있음
    • widget의 Tk 경로명
    • widget의 클래스, 클래스 이름은 그 widget을 생성하는 명령으로부터 도출가능
      예를 들어 버튼 widget의 클래스 이름은 Button이고 캔버스 클래스 이름은 Canvas
    • widget의 맨 꼭대기 윈도우의 Tk 경로명
    • 전체 binding tag인 ‘all’
  • bindtags 명령을 사용하면 binding tag와 그 순서를 바꿀 수 있음
  • tagList 파라미터는 Tcl 리스트임
  • 다음 명령은 $t에 대한 binding tag를 재배치하고 . binding tag를 삭제
bindtags $t [list all Text $t]
  • tag 리스트의 순서는 이벤트가 둘 이상의 binding tag와 일치할 때 수행할 명령의 순서를 결정
  • Tk widget은 자신이 속한 클래스에 바인딩하는 것을 기본 동작으로 함
  • widget의 이름에 이벤트를 바인딩하여 추가적인 바인딩을 추가 가능
  • 가장 꼭대기의 윈도우에 대한 바인딩은 대화 상자에서 단축키를 처리하기 위해 사용가능
  • all binding tag : 전체 widget에 해당하는 바인딩을 의미
  • all에 정의된 기본 바인딩은 widget 간에 입력 포커스를 변경
frame .one -width 30 -height 30
frame .two -width 30 -height 30
bind Frame <Enter> {%W config -bg red}
bind Frame <Leave> {%W config -bg white}
bind .two <Any-Button> {puts "Button %b at %x %y"}
pack .one .two -side left
bind all <Control-c> {destroy %W}
bind all <Enter> {focus %W}

  • Frame 클래스는 마우스가 들어오면 빨강색으로 변하고 나가면 흰색으로 변하는 명령과 바인딩
  • .two widget은 마우스 버튼이 눌려진 경우 그 정보를 화면에 표시
  • all에 대해 Control-c에 대한 바인딩을 정의했기에 모든 widget은 Ctrl-C 키를 누른 경우 사라짐

이벤트 표기법

  • 이벤트는 다음과 같은 표기법에 의해 표현
<modifier-modifire-type-detail>
  • 가장 중요한 부분은 Button이나 Motion 등의 단어가 사용되는 type 부분
  • detail은 키 이름이나 버튼 종류를 지정하기 위해 사용 (예를 들어 Key-a, Button-1)
  • modifier은 이벤트가 발생할 때 이미 눌려져 있는 키를 의미 (Control-Key-a, B2-Motion 등)
  • < >로 둘러싸서 하나의 이벤트임을 나타냄
  • 다음은 모든 이벤트 type의 리스트
    • ButtonPress, Button : 마우스 버튼이 눌림
    • ButtonRelease : 마우스 버튼이 떼어짐
    • Circulate : 윈도우의 쌓이는 순서의 변경
    • Configure : 윈도우의 크기, 위치, border 또는 쌓이는 순서가 변경
    • Destroy : 윈도우의 종료
    • Enter : 마우스가 윈도우 안으로 들어감
    • Expose : 윈도우가 아이콘 표시에서 원래 화면으로 변경
    • FocusIn : 윈도우가 입력 포커스를 받음
    • FocusOut : 윈도우가 입력 포커스를 잃음
    • Gravity : 부모 윈도우의 크기가 바뀌어 윈도우가 이동
    • KeyPress, Key : 키가 눌려짐
    • KeyReleas : 키가 떼어짐
    • Motion : 마우스가 윈도우상에서 움직임
    • Leave : 마우스가 윈도우를 떠남
    • Map : 윈도우가 열림
    • Property : 윈도우의 속성이 변경되거나 삭제
    • Reparent : 윈도우가 reparent 됨
    • Unmap : 윈도우가 아이콘 표시로 변경
    • Visibility : 윈도우의 보이는 모양이 변경

키보드 이벤트

  • KeyPress 이벤트와 KeyRelease 이벤트는 서로 다른 명령을 수행할 수 있도록 구분됨
  • KeyPress는 줄여서 Key라고 써도 되며 아예 Key도 생략가능
  • KeyPress의 경우에 양쪽을 둘러싸는 < > 기호를 생략 가능
  • 다음은 모두 같은 의미
    • <KeyPress-a>
    • <Key-a>
    • <a>
    • a
  • 이 외에도 다음과 같은 특수 키들이 정의
    • Return
    • Escape
    • BackSpace
    • Tab
    • Up, Down, Left, Right
    • comma
    • period
    • dollar
    • asciicircum
    • numbersign
    • exclam

마우스 이벤트

  • 버튼 이벤트의 경우도 ButtonPress 이벤트와 ButtonRelease 이벤트가 분리됨
  • 다음은 모두 같은 의미
    • <ButtonPress-1>
    • <Button-1>
    • <1>
  • 숫자 키 1이 눌린 이벤트인 경우는 <1>이라 표기하면 안되고
    , 또는 그냥 1 이라고 표기해야 함
  • 마우스 좌표는 %x와 %y 키워드로 얻음
  • 이렇게 얻은 마우스좌표는 widget에서의 상대 좌표
  • %X와 %Y는 화면상에서의 절대 좌표

지정자(modifier)

  • 지정자는 이벤트가 발생한 시점에 다른 키나 버튼이 눌려진 상태를 나타냄
  • 전형적인 지정자로 Shift와 Control 이 있음
  • 예를 들어 Shift와 Control을 누르고 c키를 누르는 이벤트는 로 표현
  • 주로 사용되는 지정자 리스트
    • Control : Control 키
    • Shift : Shift 키
    • Lock : caps-lock 키
    • Meta : 메타 키
    • Alt : Alt 키
    • Button1(B1), Button2(B2), ... Button5(B5) : 1(2,3...5)번째 마우스 버튼
    • Double : 더블 클릭
    • Triple : 세 번 연속으로 클릭
    • Any : 지정자의 어떤 조합도 허용

이벤트의 나열

  • bind 명령은 연속적으로 발생하는 둘 이상의 이벤트에 대해서 명령을 지정할 수 있는 기능 제공
bind . a {puts stdout A}
bind . abc {puts stdout C}
bind .foo <Control-x> <Control-s> {Save; break}

이벤트 키워드

  • 바인딩에서 사용할 수 있는 키워드들
    • %% : % 기호
    • %# : 이벤트의 일련 번호
    • %a : 이벤트의 above 필드
    • %b : 버튼 번호
    • %c : count 필드
    • %d : detail 필드
    • %f : 포커스 필드
    • %h : height 필드
    • %k : keycode 필드
    • %m : mode 필드
    • %o : override_redirect 필드
    • %p : place 필드
    • %s: state 필드
    • %t : time 필드
    • %v: value_mask 필드
    • %w : width 필드
    • %x : x 상대 좌표
    • %y : y 상대 좌표
    • %A : 출력되는 문자
    • %B : border 필드
    • %E : send_event 필드
    • %K : 이벤트의 keysim
    • %N : 10진수로 표현된 keysim
    • %R : 루트 윈도우 ID
    • %S : sub 윈도우 ID
    • %T : type 필드
    • %W : widget의 경로명
    • %X : x_root 필드
    • %Y : y_root 필드
728x90
728x90