Tk의 클립보드(clipboard)

admin의 아바타

어플리케이션 사이의 정보 교환 범용 수단으로, Copy & Paste 가 있습니다. Tk 에는 Copy & Paste 를 처리하기 위한 커맨드로, selection과 clipboard 가 준비되어 있습니다.

selection

selection 커맨드는, 윈도우의 선택 범위에 관한 조작을 기능케 합니다. 옵션은 전부 생략 가능하며, -displayof는 윈도우의 패스를 지정합니다. -selection은 PRIMARY, CLIPBOARD 중에 지정하며, 기본값은 PRIMARY 입니다. -type은, STRING, ATOM, INTEGER 중에 지정하며, 기본값은 STRING 입니다.

# 선택 범위 해제
selection clear -displayof  window -selection  selection
# 선택 범위의 문자열 얻기
selection get -selection  selection -type  type
# 선택 범위가 있는 윈도우의 패스 얻기
selection own -displayof  window -selection  selection

clipboard

clipboard 커맨드는, 클립 보드에 관한 조작을 가능케 합니다. 옵션은 전부 생략 가능하며, -displayof는 윈도우의 패스를 지정합니다. -type은 STRING, ATOM, INTEGER 중에 지정하며, 기본값은 STRING 입니다.

# 클립 보드 삭제
clipboard clear -displayof  window
# 클립 보드에 문자열 추가
clipboard append -displayof  window -type  type  string

가상 이벤트

텍스트 위젯과 엔트리 위젯은, 표준으로 Copy & Paste 를 위한 가상 이벤트를 갖고 있습니다. 보통, Copy는 Ctrl+C, Cut은 Ctrl+X, Paste는 Ctrl+V 에 바인드 되어 있습니다. 텍스트 위젯의 Copy & Paste 의 가상 이벤트 정의는 아래와 같이 되어 있습니다.

bind Text <<Copy>> {
        tk_textCopy %W
}
bind Text <<Cut>> {
        tk_textCut %W
}
bind Text <<Paste>> {
        tk_textPaste %W
}
 
# Copy
proc tk_textCopy w {
        if {![catch {set data [$w get sel.first sel.last]}]} {
                clipboard clear -displayof $w
                clipboard append -displayof $w $data
        }
}
 
# Cut
proc tk_textCut w {
        if {![catch {set data [$w get sel.first sel.last]}]} {
                clipboard clear -displayof $w
                clipboard append -displayof $w $data
                $w delete sel.first sel.last
        }
}
 
# Paste
proc tk_textPaste w {
        global tcl_platform
        catch {
                if {[string compare $tcl_platform(platform) "unix"]} {
                        catch {
                                $w delete sel.first sel.last
                        }
                }
                $w insert insert [selection get -displayof $w -selection CLIPBOARD]
        }
}

위의 예 에서는, Copy와 Cut으로 선택된 문자열을 얻어내는데, 텍스트 위젯의 get 커맨드를 사용하고 있습니다. 아래와 같이 selection 커맨드를 사용하여 동일한 처리를 할수 있습니다.

# Copy
proc tk_textCopy w {
        if {![catch {set data [selection get -displayof $w]}]} {
                clipboard clear -displayof $w
                clipboard append -displayof $w $data
        }
}