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