본문으로 바로가기

트리 스타일의 표시 위젯 TkTreeCtrl

category 카테고리 없음 2025. 9. 19. 13:10

TkTreeCtrl은 ttk::treeview와 마찬가지로 계층적인 트리 표시가 가능한 리스트 박스 위젯입니다. 여러 데이터 항목을 여러 열에 표시할 수 있으며, 약간의 코딩이 필요하지만 셀의 인라인 편집도 가능합니다. 특징은 매우 많은 설정 항목을 가지고 있어 다양한 표시를 구현할 수 있다는 점입니다. 참고 매뉴얼은 [여기] 에서 볼 수 있습니다. 여기 나열된 위젯 명령만 보더라도 상당한 기능을 엿볼 수 있습니다. 최신 버전은 2.2.10입니다. Windows에서는 ActiveTcl 배포판에 포함되어 바로 사용할 수 있지만, 위의 사이트에서 별도로 소스 및 바이너리 배포본을 다운로드할 수도 있습니다. 그 중 demos 디렉토리에는 다양한 데모가 포함되어 있습니다.

이 강좌에서는 트리 표시 예시 말고, 세로와 가로 2차원 표 형식의 표시, 편집 화면 샘플을 만들어 올려봅니다.

아래의 탭으로 구분 지어진 인구수를 표시한 텍스트 샘플을 만듭니다.

1	서울특별시	수도권 	광역단체 	9,407,540
2	부산광역시	영남권 	광역단체 	3,320,276
3	인천광역시	수도권 	광역단체 	2,964,820
4	대구광역시	영남권 	광역단체 	2,365,619
5	대전광역시	호서권 	광역단체 	1,446,749
6	광주광역시	호남권 	광역단체 	1,432,049
8	울산광역시	영남권 	광역단체 	1,111,371

Tcl 프로그램은 아래와 같습니다.

package require treectrl

# 탭으로 구분된 텍스트 파일을 읽어서
# 내용을 행, 열 2차원 리스트에 저장하여 반환합니다.
proc readDataFile dataVar {
    upvar $dataVar data
	set fd [open "./data.txt" r]
	set rows [split [read $fd] \n]
    set data {}
    foreach rowStr $rows {
        set rowArr [split $rowStr "\t"]
        if {[llength $rowArr] != 0} { lappend data $rowArr }
    }
}

# treectrl 위젯 생성
set f [frame .f]
set t [treectrl2 $f.t -font {Helvetica 12 normal} -width 400 -height 200 \
  -xscrollcommand "$f.x set" -yscrollcommand "$f.y set" ]
scrollbar $f.x -ori h -com "$t xview"
scrollbar $f.y -ori v -com "$t yview"
grid $t $f.y -sti news
grid    $f.x -sti news
grid rowconfig $f 0 -weight 1
grid columnconfig $f 0 -weight 1
pack $f

# 열 생성 및 헤더 행 정의
set x 0
foreach e [list 순위 행정구역 행정구분 인구수] {
    $t column create -text $e -expand yes -button no \
      -itembackground {#ffdddd #ddddff}
    if {$x == 0 || $x == 3} {
        $t column configure $x -itemjustify right
    }
    incr x
}

# 데이터 파일 읽기
readDataFile data

# Element 생성
$t element create eText text -fill [list #800000 { selected focus }]

# Style 생성
$t style create s1
$t style elements s1 eText
$t style layout s1 eText -padx {4 6} -expand ns -iexpand ns -sticky s

# 각 데이터 행(item) 생성
foreach rowData $data {
    set rowId [$t item create]
    set col 0
    foreach cell $rowData {
        $t item style set $rowId $col s1
        $t item text $rowId $col [lindex $rowData $col]
        incr col
    }
    $t item lastchild root $rowId
}

bind . <Control-q> exit