tkDND
tkDND(Tk Drag & Drop)는 Tk 위젯에서 드래그 앤 드롭을 가능하게 해주는 확장 라이브러리입니다. 원래 드래그 앤 드롭 기능은 플랫폼 의존성이 매우 강한 처리로, Windows와 X 윈도우 시스템에서는 겉보기에는 비슷하게 동작하더라도 프로그래밍 방식이나 사용하는 API가 완전히 다르기 때문에 네이티브 API로 직접 구현하려면 꽤 힘든 작업입니다. 하지만 tkDND는 이러한 차이를 잘 흡수하여, 동일한 Tcl 코드로 Windows에서도 X 윈도우 시스템에서도 드래그 앤 드롭을 간단하게 구현할 수 있습니다. 게다가 단순히 Tk 위젯 간만이 아니라, Tk 위젯과 다른 애플리케이션의 아이콘 등과도 드래그 앤 드롭 동작을 할 수 있습니다. 이로써 편리한 데스크탑 도구를 누구나 손쉽게 만들 수 있게 되었습니다.
tkDND는 George Petasis 씨에 의해 개발된 패키지로, 이 페이지에서 다운로드할 수 있습니다. 또한 SourceForge나 github에도 오픈소스 프로젝트 페이지가 있으며, 이곳에서도 구할 수 있습니다. 최신 버전은 2.8입니다. Windows용 바이너리 DLL도 배포되고 있으며, 2015년 2월 28일 현재 32비트 버전은 2.8, 64비트 버전은 2.7이 배포되고 있습니다.
tkDND의 드래그 & 드롭
위젯 간 드래그 & 드롭
이제부터, 여러분이 궁금해하실 드래그 & 드롭의 실제 코딩 방법을 소개하겠습니다. 먼저 간단한 샘플부터 시작하죠. tkDND를 사용하면
- Tk 위젯끼리
- 다른 애플리케이션(예: 탐색기)에서 Tk 위젯으로
- Tk 위젯에서 다른 애플리케이션(압축 툴 등)으로
드래그 & 드롭을 구현할 수 있지만, 기본은 가장 위의 "Tk 위젯끼리" 입니다. 그럼, 그 간단한 샘플 코드는 다음과 같습니다.
package require tkdnd
wm title . "예제"
label .s1 -text "소스" -fg #700040 -rel raised -bd 2
label .t1 -text "타겟" -fg #700040 -rel raised -bd 2
dnd bindsource .s1 text/plain {return "Hello D&D; World!"}
dnd bindtarget .t1 text/plain <Drop> {showmsg "%A" "%T" "%D"}
bind .s1 <Button-1> {dnd drag %W}
pack .s1 .t1 -side top -ipadx 20 -pady 10
proc showmsg {action type data} {
tk_messageBox -message "Action:$action Type:$type Data:$data"
}