`clipboard` — Tk 클립보드 다루기

clipboard — Tk 클립보드 다루기

다른 프로그램에 복사·붙여넣기한 텍스트를 주고받으려면 시스템 클립보드를 다뤄야 해요. Tk는 clipboard 명령으로 이걸 추상화해서, 클립보드를 비우고 내용을 채우고 다시 꺼내 오는 일을 간단한 하위 명령으로 처리하게 해 줘요.

출처: Tcl/Tk Manual — clipboard

본문

시그니처

clipboard option ?arg arg ...?

이 명령은 선택(selection) 메커니즘(-selection CLIPBOARD 옵션)을 통해 나중에 꺼내 쓰도록 데이터를 저장하는 Tk 클립보드에 대한 Tcl 인터페이스를 제공해요.

클립보드로 데이터를 복사하려면 먼저 clipboard clear를 호출한 뒤 clipboard append 호출을 한 번 이상 연달아 해야 해요. 클립보드가 원자적으로 갱신되도록, 모든 append는 이벤트 루프로 돌아가기 전에 끝내야 해요.

clipboard의 첫 인자는 나머지 인자의 형식과 명령의 동작을 결정해요. 현재 지원되는 형태는 다음과 같아요.

하위 명령

clipboard append ?-displayof window? ?-format format? ?-type type? ?--? datawindow의 디스플레이 클립보드에 type이 주는 형식으로, format이 주는 표현대로 data를 덧붙이고 window 디스플레이의 클립보드 소유권을 주장해요.

type은 선택이 반환될 형식(ICCCM 용어로 변환의 원하는 "target")을 지정하며, STRING이나 FILE_NAME 같은 원자(atom) 이름이어야 해요. 자세한 내용은 ICCCM(Inter-Client Communication Conventions Manual)을 참고하세요. type 기본값은 STRING이에요.

format은 선택을 요청자에게 전송하는 데 쓸 표현(ICCCM 표 2의 두 번째 열)을 지정하며 기본값은 STRING이에요. formatSTRING이면 선택은 8비트 ASCII 문자로 전송돼요. ATOM이면 데이터를 공백으로 구분된 필드로 나눠 각 필드를 원자 값으로 변환해 32비트 원자 값을 전송해요. 그 외 형식이면 데이터를 공백으로 구분해 각 필드를 32비트 정수로 변환하고 정수 배열을 선택 요청자에게 전송해요. clipboard append에 넘긴 문자열은 변환 전에 이어 붙여지므로, 문자열 경계에 적절한 공백이 있도록 호출 측이 신경 써야 해요. 같은 type으로 클립보드에 덧붙인 항목들은 모두 같은 format을 가져야 해요.

format 인자는 Tk를 쓰지 않는 클립보드 요청자와의 호환을 위해서만 필요해요. Tk 툴킷으로 CLIPBOARD 선택을 꺼내 쓰면 요청 측에서 값을 다시 문자열로 변환하므로 format은 무관해요.

-- 인자는 옵션의 끝을 표시하는 용도로 지정할 수 있어요. 그러면 다음 인자는 항상 데이터로 쓰여요. 예를 들어 데이터가 -로 시작하는 경우에 편리해요.

clipboard clear ?-displayof window?window 디스플레이의 클립보드 소유권을 주장하고 이전 내용을 모두 지워요. window 기본값은 "."이에요. 빈 문자열을 돌려줘요.

clipboard get ?-displayof window? ?-type type?window 디스플레이의 클립보드에서 데이터를 꺼내요. window 기본값은 "."이에요. type은 데이터가 반환될 형식을 지정하며 STRING이나 FILE_NAME 같은 원자 이름이어야 하고 기본값은 STRING이에요. 이 명령은 "selection get -selection CLIPBOARD"와 동등해요. 현대적인 X11 시스템에서는 문자열 전송에 가장 유용한 type이 STRING이 아니라 UTF8_STRING이라는 점을 기억하세요.

예제

클립보드의 현재 내용을 가져오기.

if {[catch {clipboard get} contents]} {
    # There were no clipboard contents at all
}

클립보드에 고정 문자열을 넣기.

clipboard clear
clipboard append "some fixed string"

커스텀 -type 옵션으로 클립보드에 임의 데이터를 넣을 수도 있어요. 이 방식은 이식성이 좋진 않지만 아주 유용해요. 이렇게 Tcl 스크립트를 넘기는 방법은 효과적이지만, 운영 코드에서는 안전 해석기(safe interpreter)와 함께 써야 해요.

# This is a very simple canvas serializer;
# it produces a script that recreates the item(s) when executed
proc getItemConfig {canvas tag} {
   set script {}
   foreach item [$canvas find withtag $tag] {
      append script {$canvas create } [$canvas type $item]
      append script { } [$canvas coords $item] { }
      foreach config [$canvas itemconf $item] {
         lassign $config name - - - value
         append script [list $name $value] { }
      }
      append script \n
   }
   return [string trim $script]
}
# Set up a binding on a canvas to cut and paste an item
set c [canvas .c]
pack $c
$c create text 150 30 -text "cut and paste me"
bind $c <<Cut>> {
   clipboard clear
   clipboard append -type TkCanvasItem \
         [getItemConfig %W current]
   # Delete because this is cut, not copy.
   %W delete current
}
bind $c <<Paste>> {
   catch {
      set canvas %W
      eval [clipboard get -type TkCanvasItem]
   }
}

더 알아보기

interp, selection 문서를 함께 보세요. 캔버스 아이템 직렬화처럼 위젯 데이터를 클립보드로 전달하는 방법은 canvas 문서에서도 다뤄져요.