본문으로 바로가기

멀티 컬럼 리스트 박스 mclistbox

category 카테고리 없음 2024. 5. 20. 15:10

Tk는 기본 멀티칼럼 리스트 박스 위젯을 제공치 않습니다. (의외로 BWidget이나 MegaWidget 에도 없습니다.) 사용을 원한다면 mclistbox를 포함한 TkTable이나 BLT's treeview, TkTreeCtrl, tablelist를 사용해야 합니다. 개인적으로 위젯의 성능 순위를 지어본다면 다음과 같습니다.

  • TkTreeCtrl
  • BLT's treeview
  • tablelist
  • mclistbox

BLT's treeview, TkTreeCtrl 위젯은 C로 작성되어 있어 대단히 빠른 속도를 보여줍니다. 또한 트리형태의 멀티 칼럼 리스트 위젯이라 유용하게 쓰입니다. 단순히 treeview 위젯만을 사용하기 위해 무거운 BLT를 사용하는 것은 대단히 비 효율적이므로, 이런 경우에는 TkTreeCtrl 위젯을 추천합니다. tablelist는 tile 위젯을 공식적으로 지원하기 시작한 멀티 칼럼 리스트 위젯입니다. (TkTreeCtrl은 자체적으로 O/S의 Native 한 스타일을 보여주고 있습니다.) 순수 Tcl로 작성되어 있어 treeview보다 느리지만, 칼럼 에디트 기능을 제공하고 있어 많이 쓰이고, 각광을 받고 있는 위젯입니다. 트리형태의 리스트 기능은 제공하지 않습니다. mclistbox는 위의 패키지들보다 오래전부터 작성되어 왔습니다. 때문에 Tcl/Tk 8.0 이상에서 동작하며, 100% 순수 Tcl로 작성되어 있기 때문에, 멀티 플랫폼에서 동작합니다.

설치

mclistbox-1.02.zip 또는 mclistbox-1.02.tar.gz의 압축을 해제하고 mclistbox-1.02의 폴더를 Tcl/lib 폴더에 복사한후 pkgIndex.tcl을 작성합니다.

# pkgIndex.tcl
package ifneeded mclistbox 1.02 \
     [list tclPkgSetup $dir mclistbox 1.02 {{mclistbox.tcl source ::mclistbox::mclistbox}}]

사용 방법

사용방법은 리스트 박스와 비슷하고 간단합니다.

package require mclistbox 1.02
catch { namespace import mclistbox::* }
 
frame .container -bd 2 -relief sunken
scrollbar .vsb -orient vertical -command [list .listbox yview]
scrollbar .hsb -orient horizontal -command [list .listbox xview]
 
mclistbox .listbox -labelanchor w -width 60 -height 5 \
   -fillcolumn address \
   -xscrollcommand [list .hsb set] \
   -yscrollcommand [list .vsb set]
.listbox column add name -label "이름" -width 16
.listbox column add phone -label "전화번호" -width 14
.listbox column add address  -label "주소" -width 30
 
grid .vsb -in .container -row 0 -column 1 -sticky ns
grid .hsb -in .container -row 1 -column 0 -sticky ew
grid .listbox -in .container -row 0 -column 0 -sticky nsew
grid columnconfigure .container 0 -weight 1
grid columnconfigure .container 1 -weight 0
grid rowconfigure    .container 0 -weight 1
grid rowconfigure    .container 1 -weight 0
pack .container -side top -fill both -expand y

# 항목을 삽입한다
.listbox insert end { 민인학1 010-6455-1071 "유성구 구성동1"}
.listbox insert end { 민인학2 010-6455-1072 "유성구 구성동2"}
.listbox insert end { 민인학3 010-6455-1073 "유성구 구성동3"}

# 이름으로 정렬한다.
.listbox label bind name "sort %W name"
 
proc sort {w id} {
set data [$w get 0 end]
set index [lsearch -exact [$w column names] $id]
set result [lsort -index $index $data]
$w delete 0 end
# ... and add our sorted data in
eval $w insert end $result
}

# 처음의 항목을 선택한다
.listbox selection set 0

예제

아래의 그림은 mclistbox에 포함되어 있는 예제(sample.tcl)로, Name, Size Last Modified의 항목으로 정렬하는 예제입니다.

시간이 되면 차후 강좌는 TkTreeCtrl, BLT's treeview, tablelist 위젯에 대해 알아보도록 하겠습니다.

다운로드

mclistbox-1.02.zip
0.04MB
mclistbox-1.02.tar.gz
0.04MB