`canvas` — 도형 그리기 표면 위젯 만들기

canvas — 도형 그리기 표면 위젯 만들기

선·원·사각형·텍스트 같은 도형을 자유롭게 그리고, 각각에 클릭 같은 동작을 붙이고 싶을 때 쓰는 게 canvas 위젯이에요. 위젯 전체가 아닌 개별 아이템 단위로 바인딩을 걸 수 있다는 점이 다른 위젯과 크게 달라요.

출처: Tcl/Tk Manual — canvas

본문

시그니처

canvas pathName ?options?

canvas 명령은 pathName이라는 새 창을 만들어 canvas 위젯으로 만들어 줘요. 호출 시점에 pathName이라는 창이 없어야 하고 부모는 존재해야 해요. 명령은 pathName을 돌려줘요. 색·3D relief 같은 canvas의 측면을 위젯 전용 옵션으로 설정할 수 있어요.

canvas 위젯은 구조화된 그래픽(structured graphics)을 구현해요. 사각형·원·선·텍스트 같은 여러 아이템을 얼마든지 표시하고, 아이템을 (이동·색 변경처럼) 조작할 수 있으며, bind 명령이 위젯에 명령을 바인딩하는 것과 비슷하게 아이템에도 명령을 연결할 수 있어요. 예를 들어 마우스 커서가 아이템 위에 있을 때 <Button-1> 이벤트에 특정 명령을 연결하면, 해당 아이템에 Tcl 스크립트로 정의된 동작을 줄 수 있어요.

위젯 전용 옵션

-closeenough — 마우스 커서가 아이템 "안"에 있는 것으로 간주되려면 얼마나 가까워야 하는지를 나타내는 부동소수점 값. 기본값 1.0.

-confinescrollRegion 인자로 정의된 영역 밖으로 canvas의 보기(view)를 설정할 수 있는지 여부. 기본값 true로, 보기가 스크롤 영역 안에 제약돼요.

-height — geometry manager에 요청할 원하는 창 높이. COORDINATES에 설명된 형태 중 아무거나 가능.

-scrollregion — 직사각형 영역의 왼쪽·위·오른쪽·아래 좌표 네 개를 설명하는 목록. 스크롤 목적으로 쓰이며 canvas 정보의 경계로 간주. 각 좌표는 COORDINATES 형태 중 아무거나 가능.

-state — canvas의 기본 상태를 바꿔요: normal, disabled, hidden 중 하나. 개별 아이템은 각자의 state 옵션으로 기본값을 덮어쓸 수 있어요. active로 시작하는 옵션은 마우스 포인터가 위에 있을 때의 모습을, disabled로 시작하는 옵션은 상태가 disabled일 때의 모습을 제어해요. disabled된 canvas 아이템은 canvas 바인딩에 반응하지 않아요.

-width — 요청할 원하는 창 폭. COORDINATES 형태.

-xscrollincrement — 가로 스크롤의 증분. 0보다 크면 창 왼쪽 가장자리의 canvas x좌표가 항상 xScrollIncrement의 짝수 배수가 되도록 가로 보기가 제약되고, 스크롤 단위도 xScrollIncrement가 돼요. 0 이하이면 가로 스크롤이 자유.

-yscrollincrement — 세로 스크롤의 증분. -xscrollincrement와 대칭 동작.

도입(INTRODUCTION)

디스플레이 목록(DISPLAY LIST)

canvas의 아이템들은 표시 목적으로 순서가 정해져요. 목록의 첫 아이템이 먼저 그려지고 다음 아이템이 그 위에 그려져요. 목록 뒤쪽 아이템은 앞쪽 아이템을 가리며, 앞쪽 아이템 "위에" 있다고 해요. 새 아이템을 만들면 디스플레이 목록 맨 끝, 즉 다른 모든 것 위에 놓여요. 위젯 명령으로 디스플레이 목록의 순서를 재배열할 수 있어요.

window 아이템은 예외예요. 기본 윈도우 시스템이 그것들이 항상 다른 아이템 위에 그려지도록 요구해요. 또 window 아이템의 쌓임 순서는 어떤 canvas 위젯 명령에도 영향받지 않아요. 대신 Tk raise 명령과 lower 명령을 써야 해요.

아이템 id와 태그(ITEM IDS AND TAGS)

canvas 아이템은 id 또는 태그(tag) 로 이름을 붙일 수 있어요. 각 아이템은 만들어질 때 부여되는 고유한 식별 번호(id)를 가져요. id는 절대 변하지 않고, canvas 위젯의 생애 동안 id 번호가 재사용되지 않아요.

각 아이템에는 태그를 몇 개든 연결할 수 있어요. 태그는 문자열이며 정수 형태를 제외한 어떤 형태든 돼요. 예를 들어 "x123"은 괜찮지만 "123"은 안 돼요. 같은 태그를 여러 아이템에 연결할 수 있어서, 예를 들어 선택된 아이템들에 "selected" 태그를 붙여 그룹화하는 데 흔히 쓰여요.

태그 all은 canvas의 모든 아이템에 암시적으로 연결돼요. canvas의 전체 아이템에 작업을 수행하는 데 쓸 수 있어요. 태그 current는 Tk가 자동 관리하며, 그린 영역이 마우스 커서 위치를 덮는 최상위 아이템(현재 아이템)에 적용돼요. 마우스가 canvas 밖에 있거나 아이템 위가 아니면 어떤 아이템도 current 태그를 갖지 않아요.

canvas 위젯 명령에서 아이템을 지정할 때, 지정자가 정수면 그 id를 가진 단일 아이템을 가리켜요. 정수가 아니면 그 지정자와 일치하는 태그를 가진 모든 아이템을 가리켜요. tagOrId는 아래에서 어떤 인자가 단일 아이템을 고르는 id인지, 또는 0개 이상의 아이템을 고르는 태그인지 나타내는 기호예요.

tagOrId에는 연산자 "&&", "||", "^", "!"와 괄호로 묶은 부분식을 써서 태그의 논리식을 넣을 수 있어요. 예:

.c find withtag {(a&&!b)||(!a&&b)}

또는 동등하게:

.c find withtag {a^b}

이것은 "a""b" 태그를 가졌지만 둘 다는 아닌 아이템만 찾아요.

일부 위젯 명령은 한 번에 하나의 아이템만 다뤄요. tagOrId가 여러 아이템을 가리키면, 명령에 적합한 디스플레이 목록의 첫(가장 낮은) 아이템을 쓰는 게 기본 동작이에요. 예외는 아래 위젯 명령 설명에 표시돼요.

좌표(COORDINATES)

canvas 관련 모든 좌표는 부동소수점 수로 저장돼요. 좌표와 거리는 화면 단위로 지정하며, 부동소수점 수 뒤에 여러 글자 중 하나가 올 수 있어요. 글자가 없으면 픽셀. m이면 밀리미터, c면 센티미터, i면 인치, p면 프린터 포인트(1/72인치). y좌표가 클수록 화면 아래쪽, x좌표가 클수록 오른쪽이에요. 좌표는 짝수 개의 매개변수로, 또는 짝수 개의 x·y 좌표 값을 담은 단일 목록 매개변수로 지정할 수 있어요.

변환(TRANSFORMATIONS)

보통 canvas 좌표계의 원점은 canvas를 포함하는 창의 좌상단이에요. xview·yview 위젯 명령으로 창 원점을 기준으로 canvas 좌표계의 원점을 조정할 수 있는데, 주로 스크롤에 써요. canvas는 창 좌표계를 기준으로 canvas 좌표계의 배율·회전을 지원하지 않아요. 개별 아이템은 아래 위젯 명령으로 이동·배율 조정할 수 있지만 회전은 못 해요.

canvas 보이는 영역의 기본 원점은 창 전체의 원점과 일치하는데, 그래야 마우스 위치를 쓰는 바인딩이 쉬워져요. 보이는 영역의 원점을 조정할 때만 canvasx·canvasy 위젯 명령을 쓰면 돼요. 다만 이는 -highlightthickness가 제어하는 포커스 링과 -borderwidth가 제어하는 창 테두리를 canvas 보이는 영역에 도달하기 전에 고려해야 한다는 뜻이기도 해요.

인덱스(INDICES)

text 아이템은 아이템 내 특정 위치를 식별하는 인덱스 개념을 지원해요. 비슷하게 line·polygon 아이템은 좌표 부분집합을 식별·삽입·삭제하는 인덱스를 지원해요. 인덱스는 문자·좌표 범위의 삽입·삭제와 삽입 커서 위치 설정 같은 명령에 쓰여요. 인덱스는 여러 방식으로 지정할 수 있고, 아이템 타입에 따라 지원하는 형태가 달라요.

text 아이템이 지원하는 형식은 다음과 같아요. 새 text류 아이템 타입을 정의한다면 가능한 한 많은 형식을 지원하는 게 좋아요. text 아이템의 마지막 문자 바로 다음 문자를 가리킬 수도 있는데, 아이템 끝에 새 텍스트를 삽입하는 작업에 필요해요. line과 polygon은 삽입 커서와 선택을 지원하지 않아요. 좌표가 항상 쌍으로 나타나므로 인덱스가 항상 짝수여야 해요.

  • number — text 아이템 내 원하는 문자의 위치를 주는 십진수. 0이 첫 문자, 1이 다음 문자. line·polygon의 인덱스가 홀수면 자동으로 1 감소돼요. 0보다 작으면 0으로, text 길이보다 크면 길이로 취급. polygon에서는 0보다 작거나 목록 길이보다 큰 수를 결과가 0~길이 사이가 되도록 길이를 더하거나 빼서 조정.
  • end — 아이템의 마지막 문자·좌표 바로 다음(아이템의 문자·좌표 수와 같음).
  • insert — 이 아이템에서 삽입 커서가 그려지는 문자 바로 앞. line·polygon엔 유효하지 않음.
  • sel.first — 아이템의 첫 선택 문자. 선택이 이 아이템에 없으면 이 형식은 불법.
  • sel.last — 아이템의 마지막 선택 문자. 선택이 없으면 불법.
  • @x,y — canvas 좌표계로 주어진 x·y 지점의 문자·좌표. x·y가 text 아이템이 덮는 좌표 밖이면 그 지점에 가장 가까운 줄의 첫·마지막 문자를 가리켜요.

대시 패턴(DASH PATTERNS)

많은 아이템이 외곽선의 대시 패턴을 지원해요. 첫 번째 문법은 정수 목록이에요. 각 요소는 선분의 픽셀 수를 나타내요. 홀수 번째 선분만 "outline" 색으로 그려지고, 나머지 선분은 투명하게 그려져요.

두 번째 문법은 ".,-_ " 다섯 문자만 담는 문자 목록이에요. 공백은 다른 선 요소 사이의 간격을 넓히는 데 쓰고, 문자열의 첫 위치엔 올 수 없어요. 예:

-dash .     → -dash {2 4}
-dash -     → -dash {6 4}
-dash -.    → -dash {6 4 2 4}
-dash -..   → -dash {6 4 2 4 2 4}
-dash {. }  → -dash {2 8}
-dash ,     → -dash {4 4}

이 문법이 이전 문법과 크게 다른 점은 모양 보존(shape-conserving) 이라는 거예요. 대시 목록의 모든 값이 표시 전에 선 폭으로 곱해져서, 선 폭과 무관하게 "."은 항상 점, "-"은 항상 대시로 표시돼요.

제한된 대시 패턴 집합만 지원하는 시스템에서는 대시 패턴이 가장 가까운 사용 가능한 패턴으로 표시돼요. 예를 들어 Windows에서는 위 예제 중 처음 4개만 사용 가능하고, 마지막 2개는 첫 번째와 동일하게 표시돼요.

위젯 명령(WIDGET COMMAND)

canvas 명령은 pathName이라는 새 Tcl 명령을 만들어요.

pathName option ?arg arg ...?

canvas에 가능한 위젯 명령은 다음과 같아요.

pathName addtag tag searchSpec ?arg arg ...?searchSpecargs가 주는 제약을 만족하는 각 아이템에, 태그가 아직 없으면 그 태그를 목록에 추가해요. 만족하는 아이템이 없으면 효과 없음. 빈 문자열 반환. searchSpec/args 형태:

  • above tagOrId — 디스플레이 목록에서 tagOrId 바로 다음(위) 아이템. tagOrId가 여러 아이템이면 목록에서 마지막(최상위) 것 사용.
  • all — canvas의 모든 아이템.
  • below tagOrId — 목록에서 tagOrId 바로 앞(아래) 아이템. 여러 아이템이면 첫(최하위) 것 사용.
  • closest x y ?halo? ?start? — x·y 지점에 가장 가까운 아이템. 같은 최단 거리 아이템이 여럿이면 그중 최상위 것(목록 마지막) 사용. halo를 주면 0 이상이어야 하고, 지점보다 halo보다 가까운 아이템은 지점과 겹치는 것으로 간주. start는 모든 가장 가까운 아이템을 원형 순회하는 데 쓰고, 태그·id로 아이템을 지정(태그면 그 태그의 목록 첫 아이템 선택). 최상위 closest 대신, 디스플레이 목록에서 start 아래에 있는 최상위 closest 아이템을 선택. 그런 아이템이 없으면 start가 없던 것처럼 동작.
  • enclosed x1 y1 x2 y2 — x1,y1,x2,y2로 주어진 직사각형 영역 안에 완전히 포함된 모든 아이템. x1≤x2, y1≤y2여야 함.
  • overlapping x1 y1 x2 y2 — 주어진 직사각형 영역과 겹치거나 포함되는 모든 아이템.
  • withtag tagOrIdtagOrId가 주는 모든 아이템.

pathName bbox tagOrId ?tagOrId ...?tagOrId들이 가리키는 모든 아이템의 대략적 경계 상자를 주는 네 요소 목록. "x1 y1 x2 y2" 형태로, 모든 요소의 그린 영역이 그 영역 안에 있어요. 몇 픽셀 과대추정할 수 있어요. 일치 아이템이 없거나 경계 상자가 비어 있으면(표시할 게 없으면) 빈 문자열 반환.

pathName bind tagOrId ?sequence? ?command?scan 명령이 위젯에 하듯, tagOrId가 주는 모든 아이템에 command를 연결해서 sequence가 그 아이템 중 하나에서 발생할 때마다 호출되게 해요. 위젯 전체가 아닌 canvas의 아이템에 대해 동작한다는 점만 빼고 bind 명령과 비슷해요. 모든 인자를 주면 새 바인딩을 만들어 같은 시퀀스·tagOrId의 기존 바인딩을 대체해요(command 첫 문자가 "+"면 대체가 아니라 기존 바인딩을 보강). 이때 빈 문자열 반환. command를 생략하면 tagOrId·sequence의 바인딩 명령 반환(없으면 오류). 둘 다 생략하면 tagOrId에 정의된 모든 시퀀스 목록 반환.

지정할 수 있는 이벤트는 마우스·키보드 관련 이벤트(Enter, Leave, ButtonPress, Motion, KeyPress 등)나 가상 이벤트뿐이에요. canvas의 이벤트 처리는 ITEM IDS AND TAGS에 정의된 current 아이템을 사용해요. Enter·Leave 이벤트는 아이템이 current가 되거나 그만둘 때 발생하고, 이는 창의 Enter·Leave 이벤트와 다르다는 점에 유의하세요. 마우스 관련 이벤트는 current 아이템(있으면)으로, 키보드 관련 이벤트는 focus 아이템(있으면, 아래 focus 위젯 명령 참고)으로 향해요. 가상 이벤트를 바인딩에 쓰면 그 가상 이벤트가 밑에 깔린 마우스·키보드 이벤트로 정의된 경우에만 발동할 수 있어요.

여러 바인딩이 한 이벤트와 일치할 수 있어요(예: 아이템 id에 연결된 바인딩 하나와 그 아이템 태그 하나에 연결된 또 다른 바인딩). 이때 일치하는 모든 바인딩이 호출돼요. all 태그 바인딩이 먼저 호출되고, 이어서 각 태그(순서대로)당 바인딩 하나, 그다음 아이템 id에 연결된 바인딩이 호출돼요. 한 태그에 일치하는 바인딩이 여럿이면 가장 구체적인 바인딩만 호출돼요. 바인딩 스크립트의 continue는 그 스크립트를 끝내고, break는 그 스크립트를 끝내면서 이벤트의 남은 스크립트를 건너뛰어요(bind 명령과 같음). bind 명령으로 canvas 창에 만든 바인딩은 canvas 아이템에 bind 위젯 명령으로 만든 바인딩에 추가로 호출돼요. 아이템 바인딩이 창 전체 바인딩보다 먼저 호출돼요.

pathName canvasx screenx ?gridspacing? — canvas 창의 창 x좌표 screenx가 주어졌을 때 그 위치에 표시되는 canvas x좌표를 반환. gridspacing을 주면 canvas 좌표를 gridspacing 단위의 가장 가까운 배수로 반올림.

pathName canvasy screeny ?gridspacing? — y좌표 버전.

pathName cget option — 설정 옵션 현재 값. pathName configure ?option? ?value? ?option value ...? — 설정 옵션 조회/수정.

pathName coords tagOrId ?x0 y0 ...? / pathName coords tagOrId ?coordList? — 아이템을 정의하는 좌표를 조회하거나 수정. 좌표를 주지 않으면 tagOrId 아이템의 좌표 목록 반환. 좌표를 주면 현재 좌표를 교체. tagOrId가 여러 아이템이면 목록의 첫 것 사용. 사각형·타원·호의 반환 좌표 목록은 고정 순서(왼쪽·위·오른쪽·아래)로, 원래 준 순서와 다를 수 있어요. 또 항상 단위 없는 화면 단위(픽셀)로 반환돼요. 원래 좌표를 센티미터·인치로 줬어도 반환값은 픽셀이에요.

pathName create type x y ?x y ...? ?option value ...? / pathName create type coordList ?option value ...?pathNametype 타입의 새 아이템 생성. type 뒤 인자 형식은 타입에 따라 다르지만, 보통 하나 이상의 점 좌표 뒤에 0개 이상의 아이템 옵션이 옴. 새 아이템의 id를 반환.

pathName dchars tagOrId first ?last?tagOrId가 주는 각 아이템에서 first~last 범위(포함)의 문자·좌표 삭제. 인덱스 연산을 지원하지 않는 아이템은 이 연산을 무시. text는 문자 인덱스, line·polygon은 좌표(x,y 쌍) 인덱스로 해석. last 생략 시 first로 기본. 빈 문자열 반환.

pathName delete ?tagOrId tagOrId ...? — 각각 주어진 아이템 삭제, 빈 문자열 반환. pathName dtag tagOrId ?tagToDelete?tagOrId가 주는 각 아이템에서 tagToDelete 태그 삭제. 그 태그가 없는 아이템은 영향 없음. tagToDelete 생략 시 tagOrId로 기본. 빈 문자열 반환.

pathName find searchCommand ?arg arg ...?searchCommandargs가 주는 제약을 만족하는 모든 아이템 목록 반환. addtag 명령이 받는 형태를 그대로 받음. 아이템은 쌓임 순서로, 가장 낮은 아이템이 먼저 반환.

pathName focus ?tagOrId? — canvas 위젯의 키보드 포커스를 tagOrId 아이템으로 설정. 여러 아이템이면 삽입 커서를 지원하는 목록의 첫 아이템으로. 어떤 아이템도 가리키지 않거나 삽입 커서를 지원하는 게 없으면 포커스 변경 안 함. tagOrId가 빈 문자열이면 focus 아이템을 재설정해 어떤 아이템도 포커스 없게 함. 지정하지 않으면 현재 포커스 아이템의 id(없으면 빈 문자열) 반환. 일단 아이템에 포커스가 설정되면 아이템이 삽입 커서를 표시하고 모든 키보드 이벤트가 그 아이템으로 향함.

canvas 안의 focus 아이템과 화면의 focus 창(focus 명령으로 설정)은 완전히 독립적이에요. 실제로 입력 포커스를 갖는 건 (a) 그 canvas가 focus 창이고 (b) 그 아이템이 canvas 안의 focus 아이템일 때뿐이에요. 대부분의 경우 focus 위젯 명령 뒤에 focus 명령으로 focus 창을 canvas로 설정하는 게 좋아요(아직 아니라면).

pathName gettags tagOrIdtagOrId 아이템에 연결된 태그 목록 반환. 여러 아이템이면 목록 첫 아이템의 태그 반환. 아무 아이템도 없거나 태그가 없으면 빈 문자열.

pathName icursor tagOrId indextagOrId 아이템의 삽입 커서 위치를 index가 가리키는 문자 바로 앞으로. 삽입 커서를 지원하지 않는 아이템은 영향 없음. 삽입 커서는 그 아이템이 현재 키보드 포커스를 가질 때만 표시되지만, 포커스가 없어도 위치는 설정 가능. 빈 문자열 반환.

pathName imove tagOrId index x ytagOrId가 가리키는 각 아이템의 index번째 좌표를 (x,y) 위치로 재배치. 각 아이템은 인덱스를 INDICES 규칙대로 독립 해석. 표준 아이템 중 line·polygon만 이렇게 좌표를 재배치할 수 있어요.

pathName index tagOrId indextagOrId 안에서 index에 해당하는 숫자 인덱스의 십진 문자열 반환. 반환값은 아이템의 문자·좌표 수와 0 사이(포함)임이 보장됨. 여러 아이템이면 인덱스 연산을 지원하는 목록 첫 아이템에서 처리.

pathName insert tagOrId beforeThis string — 텍스트·좌표 삽입을 지원하는 tagOrId 아이템 각각에, beforeThis 인덱스의 문자·좌표 바로 앞에 string 삽입. text는 문자 인덱스, line·polygon은 좌표 인덱스로 해석하고, line·polygon의 string은 유효한 좌표 시퀀스여야 함. 빈 문자열 반환.

pathName itemcget tagOrId optiontagOrId 아이템의 option 설정 옵션 현재 값. cget 위젯 명령과 비슷하되 위젯 전체가 아닌 특정 아이템에 적용. tagOrId가 여러 아이템이면 첫(최하위) 아이템 사용.

pathName itemconfigure tagOrId ?option? ?value? ?option value ...?configure 위젯 명령과 비슷하되 전체 canvas가 아닌 tagOrId 아이템의 아이템별 옵션을 수정. 옵션 없이 호출하면 첫 아이템의 모든 옵션 목록 반환, 값 없는 옵션 하나는 그 옵션 설명, 옵션-값 쌍을 주면 각 아이템의 해당 옵션을 설정하고 빈 문자열 반환. 옵션과 값은 create 위젯 명령에서 허용되는 것과 동일.

pathName lower tagOrId ?belowThis?tagOrId 아이템을 디스플레이 목록의 belowThis 바로 앞 위치로 이동. 여러 아이템이면 모두 이동하되 상대 순서는 유지. belowThis는 태그·id이고 여러 아이템이면 목록의 첫(최하위) 것을 목적지로 사용. window 아이템엔 효과 없음(window 아이템은 항상 다른 타입을 가리고, 쌓임 순서는 raise·lower 명령이 결정). 빈 문자열 반환.

pathName move tagOrId xAmount yAmounttagOrId 아이템 각각의 각 점 x좌표에 xAmount, y좌표에 yAmount 더해 canvas 좌표 공간에서 이동. 빈 문자열 반환.

pathName moveto tagOrId xPos yPostagOrId 아이템을, 그 태그의 첫(목록에서 최하위) 아이템의 첫 좌표 쌍(경계 상자 좌상단)이 (xPos,yPos)에 오도록 이동. xPos/yPos는 빈 문자열일 수 있고 그땐 해당 좌표는 유지. 일치 아이템들은 서로 상대 위치를 유지. 빈 문자열 반환.

pathName postscript ?option value option value ...? — canvas 일부·전체의 Postscript 표현 생성. -file 옵션을 주면 파일에 쓰고 빈 문자열 반환, 아니면 Postscript를 명령 결과로 반환. canvas를 소유한 해석기가 safe로 표시되면, safe 해석기는 파일 쓰기가 금지되므로 실패. -channel 옵션은 이미 쓰기용으로 연 채널 이름이고 여기에 쓰며 끝나도 열어 둠. Postscript는 Document Structuring Conventions 3.0의 Encapsulated Postscript 형태로 생성.

참고: 기본적으로 canvas 창에 화면에 나타나는 정보에 대해서만 Postscript가 생성돼요. canvas를 막 만들었으면 초기 크기가 1x1픽셀일 수 있어 Postscript에 아무것도 안 나와요. 이를 피하려면 update 명령으로 canvas 창이 최종 크기에 도달할 때까지 기다리거나, -width·-height 옵션으로 인쇄할 영역을 지정하세요.

지원되는 옵션:

  • -channel channelName — Postscript를 쓸 채널 이름. 이 옵션·-file 둘 다 없으면 Postscript를 결과로 반환.
  • -colormap varName — Postscript에 쓸 색 매핑을 지정하는 배열 변수 이름. 각 요소는 특정 색 값을 설정하는 Postscript 코드(예: "1.0 1.0 0.0 setrgbcolor"). 색 정보를 출력할 때 Tk는 varName에 그 색과 같은 이름의 요소가 있는지 확인하고, 있으면 그 요소 값을 색 설정 Postscript 명령으로 사용. 지정하지 않았거나 해당 색 항목이 없으면 X 색의 red·green·blue 세기를 사용.
  • -colormode mode — 색 정보 출력 방식. color(풀컬러), gray(모든 색을 회색조로), mono(모든 색을 흑백으로).
  • -file fileName — Postscript를 쓸 파일 이름. -channel·이 옵션 둘 다 없으면 결과로 반환.
  • -fontmap varName — Postscript에 쓸 폰트 매핑을 지정하는 배열 변수. 각 요소는 Postscript 폰트의 이름·포인트 크기 두 요소의 Tcl 목록. 특정 폰트에 대한 Postscript 명령을 출력할 때 Tk는 varName에 같은 이름 요소가 있는지 확인하고 있으면 그 정보를 사용. 없으면 Tk가 어떤 Postscript 폰트를 쓸지 추측하며, 추측은 보통 Times·Helvetica·Courier 같은 잘 알려진 폰트에서만 동작하고 X 폰트 이름이 포인트 크기까지 대시를 생략하지 않았을 때만 동작. 예를 들어 -*-Courier-Bold-R-Normal--*-120-*는 동작하지만 *Courier-Bold-R-Normal*120*는 안 돼요(폰트 이름 파싱에 대시가 필요).
  • -height size — 인쇄할 canvas 영역의 높이. 기본값은 canvas 창 높이.
  • -pageanchor anchor — 인쇄 영역의 어느 지점이 페이지의 위치 지정 지점(-pagex·-pagey가 정함)에 올지. 예: -pageanchor n은 인쇄 영역 위 중앙이 위치 지정 지점 위로. 기본값 center.
  • -pageheight size — 인쇄 영역이 Postscript 페이지에서 size 높이가 되도록 x·y 모두 배율 조정. sizec(센티미터)·i(인치)·m(밀리미터)·p 또는 없음(프린터 포인트, 1/72인치) 뒤의 부동소수점 수. 기본값은 화면의 인쇄 영역 높이. -pageheight·-pagewidth 둘 다 지정하면 -pagewidth의 배율 인자를 사용(비균일 배율은 미구현).
  • -pagewidth size — 인쇄 영역이 size 폭이 되도록 배율 조정. -pageheight와 같은 형식. 기본값은 화면 인쇄 영역 폭.
  • -pagex position-pageheight 허용 형식 중 아무거나 써서 페이지의 위치 지정 지점 x좌표. -pagey·-pageanchor와 함께 인쇄 영역 위치 결정. 기본값 페이지 중앙.
  • -pagey position — 위치 지정 지점 y좌표. 기본값 페이지 중앙.
  • -rotate boolean — 인쇄 영역을 90도 회전할지. 비회전 출력은 인쇄 영역 x축이 페이지 짧은 방향("portrait"), 회전하면 긴 방향("landscape"). 기본값 비회전.
  • -width size — 인쇄할 canvas 영역의 폭. 기본값 canvas 창 폭.
  • -x position — 인쇄할 canvas 영역 왼쪽 가장자리의 x좌표(canvas 좌표, 창 좌표 아님). 기본값 창 왼쪽 가장자리 좌표.
  • -y position — 인쇄할 영역 위쪽 가장자리의 y좌표(canvas 좌표). 기본값 창 위쪽 가장자리 좌표.

pathName raise tagOrId ?aboveThis?tagOrId 아이템을 디스플레이 목록의 aboveThis 바로 뒤로 이동. lower와 대칭. window 아이템엔 효과 없음. 빈 문자열 반환.

pathName rchars tagOrId first last stringtagOrId가 가리키는 각 아이템의 first~last 사이 문자·좌표를 string으로 교체. 각 아이템은 인덱스를 INDICES 규칙대로 독립 해석. text 아이템은 텍스트를, line·polygon 아이템은 좌표 목록을 교체(string은 교체에 쓸 좌표 목록). 그 외 아이템은 무시.

pathName scale tagOrId xOrigin yOrigin xScale yScale — canvas 좌표 공간에서 tagOrId 아이템 좌표를 재배율. xOrigin·yOrigin은 배율 연산의 원점, xScale·yScale은 x·y 좌표의 배율 인자(1.0이면 그 좌표 불변). 각 아이템을 정의하는 각 점에 대해 x좌표는 xOrigin으로부터 거리가 xScale 배가 되도록, y좌표는 yOrigin으로부터 거리가 yScale 배가 되도록 조정. 빈 문자열 반환. 일부 아이템은 좌표 쌍이 하나뿐이라(text, image, window) 이 명령으로는 이동만 될 수 있어요.

pathName scan option args — canvas의 스캐닝 구현. 두 형태:

  • pathName scan mark x yx,y와 canvas 현재 보기를 기록. 나중 scan dragto와 함께 사용. 보통 위젯의 마우스 버튼 누름에 연결되고 x,y는 마우스 좌표. 빈 문자열 반환.
  • pathName scan dragto x y ?gain? — 이 명령의 x,y와 마지막 scan markx,y 차이를 계산하고 보기를 차이의 gain배(gain 기본 10)로 조정. 보통 위젯의 마우스 이동 이벤트에 연결되어 canvas를 창을 통해 고속으로 끄는 효과. 빈 문자열 반환.

pathName select option ?tagOrId arg? — 여러 방식으로 선택 조작. 아래 형태 중 아무거나. 아래 모든 설명에서 tagOrId는 인덱스·선택을 지원하는 아이템을 가리켜야 하며, 여러 아이템이면 그중 인덱스·선택을 지원하는 첫 아이템 사용. index는 INDICES의 위치 텍스트 설명.

  • pathName select adjust tagOrId indextagOrId의 선택 끝 중 index에 가장 가까운 쪽을 찾아 그 끝을 index로 조정(index 포함하되 넘지 않음). 다른 끝은 이후 select to의 앵커로 만듦. 선택이 tagOrId에 없으면 select to 위젯 명령과 같이 동작. 빈 문자열 반환.
  • pathName select clear — 이 위젯에 선택이 있으면 지움. 없으면 효과 없음. 빈 문자열 반환.
  • pathName select from tagOrId index — 위젯의 선택 앵커를 tagOrId 아이템의 index 문자 바로 앞으로 설정. 선택 자체는 바꾸지 않고 이후 select to의 고정 끝만 설정. 빈 문자열 반환.
  • pathName select item — 이 canvas의 아이템에 선택이 있으면 선택된 아이템의 id, 없으면 빈 문자열 반환.
  • pathName select to tagOrId index — 선택을 tagOrId의 선택 앵커와 index 사이 문자로 설정. 새 선택은 index 문자를 포함하고, index가 앵커보다 크거나 같을 때만 앵커 문자를 포함. 앵커는 이 위젯의 가장 최근 select adjust·select from이 결정. 위젯의 선택 앵커가 현재 tagOrId에 없으면 index와 같은 문자로 설정. 빈 문자열 반환.

pathName type tagOrIdtagOrId 아이템의 타입(예: rectangle, text) 반환. 여러 아이템이면 목록 첫 아이템의 타입. 아무 아이템도 없으면 빈 문자열.

pathName xview ?args? — canvas 창에 표시된 정보의 수평 위치 조회/변경:

  • pathName xview — 두 요소 목록 반환. 각 요소는 0~1 실수 분수로 창에 보이는 수평 범위. 예: 첫 .2 둘째 .6이면 canvas 영역(-scrollregion 기준)의 왼쪽 20%가 화면 밖, 중간 40% 보임, 오른쪽 40% 화면 밖. -xscrollcommand로 스크롤바에 전달되는 값.
  • pathName xview moveto fraction — canvas 폭의 fraction만큼이 왼쪽 화면 밖이 되도록 보기 조정. 0~1.
  • pathName xview scroll number whatnumber·what에 따라 좌우 이동. number 정수. whatunits 또는 pages(약어 가능). units-xscrollincrement가 0보다 크면 그 단위로, 아니면 창 폭의 1/10 단위로. pages면 창 폭의 9/10 단위. number 음수면 왼쪽, 양수면 오른쪽 정보가 보임.

pathName yview ?args? — 세로 버전. yview, yview moveto fraction, yview scroll number what(units-yscrollincrement나 창 높이 1/10, pages는 창 높이 9/10).

아이템 타입 개요(OVERVIEW OF ITEM TYPES)

아래 절은 canvas 위젯이 지원하는 각 아이템 타입을 설명해요. 각 타입은 두 가지로 특징지어져요. 첫째, 그 타입의 인스턴스를 만드는 create 명령의 형태. 둘째, create·itemconfigure 위젯 명령에서 쓸 수 있는 그 타입의 설정 옵션 집합. 대부분의 아이템은 인덱스·선택이나 그 관련 명령(index, insert 등)을 지원하지 않아요. 지원하는 곳은 아래 설명에 명시돼요. 현재는 text, line, polygon 아이템이 지원해요. line·polygon의 경우 인덱스 기능은 아이템의 좌표를 조작하는 데 쓰여요.

공통 아이템 옵션(COMMON ITEM OPTIONS)

많은 아이템이 공통 옵션 집합을 공유해요. 여기서 설명하고 각 위젯 타입에서 간결히 참조해요.

  • -anchor anchorPos — 아이템을 위치 지정 지점에 어떻게 배치할지. Tk_GetAnchor가 받는 형태. 예: center면 지점에 중앙 정렬, n이면 위 중앙이 지점에 오도록. 기본 center.
  • -dash pattern / -activedash pattern / -disableddash pattern — 아이템의 normal·active·disabled 상태의 대시 패턴. Tk_GetDash가 받는 형태. 생략하면 기본 실선 외곽선.
  • -dashoffset offset-dash 패턴의 시작 오프셋(픽셀). -dash 없으면 무시. COORDINATES 형태.
  • -fill color / -activefill color / -disabledfill color — normal·active·disabled 상태에서 아이템 영역 채우기 색. even-odd 채우기 규칙 사용. Tk_GetColor가 받는 형태. line 아이템에선 선 색, text 아이템에선 텍스트 전경색. 비어 있으면(line·text 제외 기본값) 채우지 않음.
  • -outline color / -activeoutline color / -disabledoutline color — normal·active·disabled 상태의 외곽선 색. 빈 문자열이면 외곽선 안 그림.
  • -offset offset — 스티플(스티플)의 오프셋. x,yside(n,ne,e,se,s,sw,w,nw,center) 형태. 첫 경우 원점은 현재 창의 toplevel 원점. canvas 자체와 canvas 객체는 canvas 원점이지만 좌표 쌍 앞에 #를 붙이면 toplevel 원점 사용. canvas 객체에서 -offset은 스티플링에도 사용. line·polygon 아이템은 인덱스를 인자로 지정해 스티플 원점을 그 좌표 점에 연결할 수도 있음. 스티플 오프셋은 X11에서만 지원되고 다른 플랫폼에선 조용히 무시됨.
  • -outlinestipple bitmap / -activeoutlinestipple / -disabledoutlinestipple — normal·active·disabled 상태의 외곽선 스티플 패턴. -outline이 지정되지 않으면 무효. 빈 문자열(기본)이면 실선. X11이 아닌 그리기 API 플랫폼에선 스티플이 잘 지원되지 않음.
  • -outlineoffset offset — 외곽선에 쓰는 스티플 패턴의 오프셋(-offset과 같은 문법).
  • -stipple bitmap / -activestipple / -disabledstipple — normal·active·disabled 상태의 채우기 스티플 패턴. -fill이 지정되지 않으면 무효. 빈 문자열이면 단색 채움. text 아이템에선 실제 텍스트에 영향.
  • -state state — 아이템이 canvas 위젯의 전역 state 옵션을 덮어씀. 같은 값 normal, disabled, hidden.
  • -tags tagList — 아이템에 적용할 태그 집합. 기존 태그를 교체. 빈 목록 가능.
  • -width outlineWidth / -activewidth / -disabledwidth — normal·active·disabled 상태의 외곽선 폭. COORDINATES 형태. -outline이 빈 문자열이면 무효. 기본 1.0. 호에서는 넓은 외곽선이 호 영역 가장자리에 중앙 정렬로 그려짐.

표준 아이템 타입(STANDARD ITEM TYPES)

ARC ITEMS — arc 아이템은 호 모양 영역으로 나타나요. 두 각(-start·-extent 옵션)으로 경계가 정해진 타원의 한 부분이고, -style 옵션으로 여러 방식으로 표시돼요.

pathName create arc x1 y1 x2 y2 ?option value ...?
pathName create arc coordList ?option value ...?

x1,y1,x2,y2 또는 coordList는 호를 정의하는 타원을 감싸는 직사각형 영역의 대각 두 모서리 좌표. 좌표 뒤엔 설정 옵션을 설정하는 옵션-값 쌍이 올 수 있고, itemconfigure에도 쓸 수 있음. arc 아이템은 마우스 포인터가 그려진 부분(완전 투명이면 -fill·-outline 둘 다 비어 있지 않았다면 그려졌을 부분) 위에 있을 때 current가 됨. 표준 옵션: -dash, -activedash, -disableddash, -dashoffset, -fill, -activefill, -disabledfill, -offset, -outline, -activeoutline, -disabledoutline, -outlineoffset, -outlinestipple, -activeoutlinestipple, -disabledoutlinestipple, -stipple, -activestipple, -disabledstipple, -state, -tags, -width, -activewidth, -disabledwidth.

추가 옵션:

  • -extent degrees — 호가 차지하는 각도 범위 크기. -start가 주는 시작 각도에서 반시계방향으로 degrees만큼. 음수 가능. 360보다 크거나 -360보다 작으면 modulo 360 값을 extent로 사용.
  • -start degrees — 호가 차지하는 각도 범위의 시작. 3시 방향에서 반시계로 잰 도(degree) 단위. 양수·음수 모두 가능.
  • -style type — 호 그리기 방식. pieslice(기본)면 타원 둘레 한 부분 + 중심과 둘레 부분 각 끝을 잇는 두 선분으로 영역 정의. chord면 둘레 부분 + 두 끝점을 잇는 선분 하나. arc면 둘레 부분만. 마지막 경우 -fill 옵션은 무시됨.

BITMAP ITEMS — bitmap 아이템은 전경·배경 두 색의 이미지로 나타나요.

pathName create bitmap x y ?option value ...?

x,y 또는 coordList(두 요소)는 -anchor 옵션이 제어하는 방식으로 비트맵을 배치할 점 좌표. 표준 옵션: -anchor, -state, -tags. 추가 옵션:

  • -background color / -activebackground / -disabledbackground — normal·active·disabled 상태에서 비트맵의 "0" 값 픽셀에 쓸 색. 지정하지 않거나 빈 문자열이면 0 픽셀 위치에 아무것도 표시 안 함(투명 효과).
  • -bitmap bitmap / -activebitmap / -disabledbitmap — normal·active·disabled 상태에서 표시할 비트맵. Tk_GetBitmap 형태.
  • -foreground color / -activeforeground / -disabledforeground — 비트맵의 "1" 값 픽셀 색.

IMAGE ITEMS — image 아이템은 canvas에 이미지를 표시.

pathName create image x y ?option value ...?

표준 옵션: -anchor, -state, -tags. 추가 옵션:

  • -image name / -activeimage name / -disabledimage name — normal·active·disabled 상태에서 표시할 이미지 이름. 이 이미지는 image create 명령으로 이전에 만들어져 있어야 함.

LINE ITEMS — line 아이템은 연결된 선분·곡선 하나 이상으로 나타나요. dchars, index, insert 위젯 명령으로 좌표 인덱싱을 지원해요.

pathName create line x1 y1... xn yn ?option value ...?

x1~yn 또는 coordList는 연결된 선분 시리즈를 설명하는 둘 이상의 점 좌표. line 아이템은 마우스 포인터가 선의 어떤 선분(그렸든 안 그렸든, 평활화됐든 아니든) 위에 있을 때 current임. 표준 옵션: -dash, -activedash, -disableddash, -dashoffset, -fill, -activefill, -disabledfill, -stipple, -activestipple, -disabledstipple, -state, -tags, -width, -activewidth, -disabledwidth.

추가 옵션:

  • -arrow where — 선 한쪽/양쪽 끝에 화살촉 그릴지. none(없음), first(첫 점에), last(마지막 점에), both(양쪽). 기본 none. 화살촉을 그릴 때 Tk는 선 끝점을 내부 조정해 선이 화살촉 목이 아니라 그 끝에서 끝나도록 해서 화살촉 가장자리를 넘지 않게 함(그 줄 끝에 마우스가 있으면 Leave 이벤트 유발 가능). 화살촉 제거 시 그 반대로 조정해 Enter 이벤트 유발 가능.
  • -arrowshape shape — 화살촉 그리는 방식. shape는 COORDINATES 형태 거리 세 요소 목록. 첫 요소는 화살촉 목에서 끝까지의 거리, 둘째는 화살촉 뒤끝에서 끝까지, 셋째는 선 바깥 가장자리에서 뒤끝까지. 지정 안 하면 Tk가 "합리적인" 모양 선택.
  • -capstyle style — 선 끝점의 캡 방식. Tk_GetCapStyle 형태(butt, projecting, round). 기본 butt. 화살촉이 그려지는 곳에선 무시.
  • -joinstyle style — 선 꼭짓점의 이음 방식. Tk_GetJoinStyle 형태(bevel, miter, round). 기본 round. 선에 점이 둘뿐이면 무관.
  • -smooth smoothMethodTcl_GetBoolean이나 선 평활화 방법이 받는 형태. 코어에서는 trueraw만 지원(beziertrue의 별칭)하고 런타임에 더 추가 가능. false 값이나 빈 문자열이면 평활화 안 함. true 값이면 true 평활화로 가정. true이면 선을 이차 스플라인 집합으로 렌더링된 곡선으로 그려요. 첫·둘째 선분에 스플라인 하나, 둘째·셋째에 하나, 이런 식. 원하는 선분의 끝점을 복제하면 곡선 안에 직선 선분을 만들 수 있음. raw이면 선을 곡선으로 그리는데, 좌표 목록에서 첫 좌표 쌍(그리고 이후 세 번째마다)이 3차 Bezier 곡선의 매듭점(knot point)이고 나머지 좌표가 그 곡선의 제어점이에요. 제어점을 인접 매듭점과 같게 만들면 곡선 안에 직선 선분 생성. 마지막 점이 매듭점이 아닌 제어점이면 그 점을 (한두 번) 반복해 매듭점으로 만듦.
  • -splinesteps number — 곡선의 원하는 평활도. 각 스플라인을 number개의 선분으로 근사. -smoothtrue/raw일 때만 의미.

OVAL ITEMS — oval 아이템은 원·타원 영역으로 나타나요. 외곽선·채움 중 하나 또는 둘 다 가능.

pathName create oval x1 y1 x2 y2 ?option value ...?

x1,y1,x2,y2(또는 coordList)는 타원을 감싸는 직사각형의 대각 모서리. 타원은 직사각형의 위·왼쪽 가장자리는 포함하고 아래·오른쪽 가장자리는 포함하지 않아요. 영역이 정사각형이면 원, 아니면 길쭉한 모양. 표준 옵션: arc와 동일 목록. oval 전용 옵션은 없음.

POLYGON ITEMS — polygon 아이템은 다각형·곡면 채움 영역으로 나타나요. dchars, index, insert로 좌표 인덱싱을 지원.

pathName create polygon x1 y1 ... xn yn ?option value ...?

x1~yn(또는 coordList)는 다각형을 정의하는 셋 이상의 점 좌표. 모양을 닫으려고 첫 점을 마지막에 반복하면 안 돼요. Tk가 첫·마지막 점 사이 주변을 자동으로 닫음. 표준 옵션: arc·oval과 동일. 추가 옵션:

  • -joinstyle style — 외곽선 꼭짓점의 이음 방식(bevel, miter, round). 기본 round.
  • -smooth boolean — line의 -smooth와 같은 동작(선 평활화 방법 포함, true/raw/bezier).
  • -splinesteps number — 곡선 평활도. -smooth가 true/raw일 때만 의미.

polygon 아이템은 사각형·타원·호 같은 다른 아이템과 달리, 채워지지 않아도 내부 점이 polygon "안"으로 간주돼요(예: find closest·find overlapping에서). 대부분의 다른 아이템 타입은 채워졌거나 채움·외곽선 둘 다 없을 때만 내부 점을 아이템 안으로 봐요. 내부 점이 다각형 안으로 여겨지지 않는 채워지지 않은 다각형을 원하면 line 아이템을 쓰세요.

RECTANGLE ITEMS — rectangle 아이템은 직사각형 영역으로 나타나요. 외곽선·채움 중 하나 또는 둘 다.

pathName create rectangle x1 y1 x2 y2 ?option value ...?

coordList는 네 요소여야 함. 직사각형은 위·왼쪽 가장자리는 포함하고 아래·오른쪽은 포함하지 않음. 표준 옵션: arc·oval과 동일. rectangle 전용 옵션 없음.

TEXT ITEMS — text 아이템은 한 줄 이상의 문자열을 화면에 표시하고, dchars·focus·icursor·index·insert·select 위젯 명령을 통한 인덱싱·편집·선택을 지원해요.

pathName create text x y ?option value ...?

표준 옵션: -anchor, -fill, -activefill, -disabledfill, -stipple, -activestipple, -disabledstipple, -state, -tags. 추가 옵션:

  • -angle rotationDegrees — 텍스트를 위치 지정 지점 기준으로 반시계로 회전할 도 수. 0.0~360.0의 부동소수점. 90이면 텍스트를 아래에서 위로 세로로 그림. 기본 0.0.
  • -font fontName — 텍스트 아이템에 쓸 폰트. Tk_GetFont 받는 문자열. 기본 시스템 의존 폰트.
  • -justify how — 경계 영역 안 텍스트 정렬. left, right, center 중 하나. 여러 줄로 표시될 때만 의미. 기본 left.
  • -text string — text 아이템에 표시할 문자. 개행 문자는 줄바꿈 유발. insert·delete 위젯 명령으로도 바꿀 수 있음. 기본 빈 문자열.
  • -underline — 텍스트 내 밑줄 칠 문자의 정수 인덱스. 0이 첫 문자. -1이면 밑줄 없음(전체 텍스트를 밑줄 치려면 적절한 폰트를 쓰는 게 나음).
  • -width lineLength — 텍스트의 최대 줄 길이(COORDINATES 형태). 0(기본)이면 개행 문자에서만 줄바꿈. 0이 아니면 lineLength보다 길어질 줄은 공백 문자 바로 앞에서 잘라 줄을 짧게 함(공백을 개행처럼 취급).

WINDOW ITEMS — window 아이템은 특정 창을 canvas의 주어진 위치에 표시.

pathName create window x y ?option value ...?

표준 옵션: -anchor, -state, -tags. 추가 옵션:

  • -height pixels — 아이템 창에 할당할 높이. COORDINATES 형태. 지정하지 않거나 0이면 창이 내부적으로 요청한 높이.
  • -width pixels — 아이템 창에 할당할 폭. COORDINATES 형태. 지정하지 않거나 0이면 창이 요청한 폭.
  • -window pathName — 이 아이템과 연결할 창. canvas 위젯의 자식이거나 canvas 위젯 조상의 자식이어야 함. top-level 창은 안 됨.

참고: 창 관리 방식의 제약 때문에 window 아이템 위에 다른 그래픽 아이템(선·이미지 등)을 그리는 건 불가능해요. window 아이템은 디스플레이 목록 순서와 무관하게 겹치는 그래픽을 항상 가려요. 또 window 아이템은 다른 canvas 아이템과 달리 포함하는 canvas의 테두리로 클리핑되지 않고, -window 옵션이 지정한 창의 부모 위젯으로 클리핑돼요. 부모가 canvas면 window 아이템이 canvas 테두리와 겹칠 수 있어요.

애플리케이션 정의 아이템 타입(APPLICATION-DEFINED ITEM TYPES)

개별 애플리케이션이 C 코드로 canvas 위젯의 새 아이템 타입을 정의할 수 있어요. Tk_CreateItemType 설명을 참고하세요.

바인딩(BINDINGS)

현재 구현에서 새 canvas에는 기본 동작이 없어요. canvas에 동작을 부여하려면 명시적 Tcl 명령을 직접 실행해야 해요.

크레딧(CREDITS)

Tk의 canvas 위젯은 Joel Bartlett의 ezd 프로그램 아이디어를 그대로 차용했어요. ezd는 Scheme 환경에서 구조화된 그래픽을 제공했고 canvas보다 1~2년 앞섰어요. 그래픽 객체를 배치·애니메이션하는 그 단순한 메커니즘이 canvas 기능에 영감을 줬어요.

더 알아보기

bind, font, image, scrollbar 문서를 함께 보세요. 특정 아이템 타입(arc, line, text 등)을 확장해 정의하려면 Tk_CreateItemType도 참고하세요.