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