본문으로 바로가기

Tk의 바인드(bind)

category 카테고리 없음 2025. 8. 14. 22:01

바인드

바인드는 키보드나 마우스 등의 이벤트에 대해 액션을 기술하는 기능입니다. 아래 예는 버튼에 커서를 올리면 Push라는 글자가 빨간색으로 변하고, 버튼에서 커서를 떼면 Push라는 글자가 검은색으로 돌아옵니다.

pack [button .btn -text Push -command exit]

bind .btn <Enter> {
    %W configure -fg red
}

bind .btn <Leave> {
    %W configure -fg black
}

bind의 첫 번째 인수는 위젯의 경로명 또는 윈도우 이름, 혹은 all을 지정합니다. bind 스크립트 내의 "%W" 는 이벤트가 발생한 위젯이며, 여기서는 .btn이 됩니다. 예를 들어, 아래와 같이 위젯 클래스명(Button)을 지정하면 모든 버튼에 대해 바인드가 적용됩니다.  all을 지정하면 모든 윈도우가 대상이 됩니다.

bind Button <Enter> {
    %W configure -fg red
}

아래는 바인드에서 다룰 수 있는 이벤트 종류입니다.

Activate Enter Map  
ButtonPress, Button Expose Motion  
ButtonRelease FocusIn MouseWheel  
Circulate FocusOut Property  
Colormap Gravity Reparent  
Configure KeyPress,  Key Unmap  
Deactivate KeyRelease Visibility  
Destroy Leave

아래는 사용 가능한 수정자(modifier)입니다.

Control Mod2, M2  
Shift Mod3, M3  
Lock Mod4, M4  
Button1, B1 Mod5, M5  
Button2, B2 Meta, M  
Button3, B3 Alt  
Button4, B4 Double  
Button5, B5 Triple  
Mod1, M1

아래와 같이 이벤트와 수정자를 조합해서 사용할 수 있습니다.

# 왼쪽 버튼을 클릭했을 때
bind tag <Button-1> {}

# 왼쪽 버튼을 더블 클릭했을 때
bind tag <Double-Button-11> {}

# 왼쪽 버튼을 세번 클릭했을 때
bind tag <Triple-Button-11> {}

# Enter 키를 눌렀을 때
bind tag <Key-Return> {}

가상 이벤트  

플랫폼 의존성을 없애기 위해 가상 이벤트라는 기능이 있습니다. 예를 들어, 클립보드에 복사를 할 때 UNIX는 마우스 왼쪽 버튼, Windows는 Ctrl+C를 사용합니다. 프로그램에서 복사를 위한 바인드를 작성할 때, "복사"라는 가상 이벤트가 있으면 프로그램을 범용적으로 작성할 수 있습니다. 아래는 예약된 가상 이벤트입니다.  

<<PasteSelection>> <<Copy>> <<Cut>> <<Paste>>

가상 이벤트의 "Copy"를 사용하면 바인드 기술이 간결해집니다.

bind . <<Copy>> {}

가상 이벤트는 추가할 수도 있습니다.  처리를 중지하는 가상 이벤트를 추가해봅시다.

if {$tcl_platform(platform) == "unix"} {
    event add <<Cancel>> <Control-c>
} elseif {$tcl_platform(platform) == "windows"} {
    event add <<Cancel>> <Escape>
} elseif {$tcl_platform(platform) == "macintosh"} {
    event add <<Cancel>> <Command-.>
}