blob: ed2f55a6c31a98fda10b43c89bc97ca47c9fb3dd (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
# mclist.tcl --
#
# This demonstration script creates a toplevel window containing a Ttk
# tree widget configured as a multi-column listbox.
#
# RCS: @(#) $Id: mclist.tcl,v 1.1 2007/11/02 23:48:11 dkf Exp $
if {![info exists widgetDemo]} {
error "This script should be run from the \"widget\" demo."
}
package require Tk
package require Ttk
set w .mclist
catch {destroy $w}
toplevel $w
wm title $w "Multi-Column List"
wm iconname $w "mclist"
positionWindow $w
## Explanatory text
ttk::label $w.msg -font $font -wraplength 4i -justify left -anchor n -text "Ttk is the new Tk themed widget set. One of the widgets it includes is a tree widget, which can be configured to display multiple columns of informational data without displaying the tree itself. This is a simple way to build a listbox that has multiple columns. Clicking on the heading for a column will sort the data by that column. You can also change the width of the columns by dragging the boundary between them."
pack $w.msg -fill x
## See Code / Dismiss
pack [addSeeDismiss $w.seeDismiss $w] -side bottom -fill x
ttk::frame $w.container
ttk::treeview $w.tree -columns {country capital currency} -show headings \
-yscroll "$w.vsb set" -xscroll "$w.hsb set"
if {[tk windowingsystem] ne "aqua"} {
ttk::scrollbar $w.vsb -orient vertical -command "$w.tree yview"
ttk::scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
} else {
scrollbar $w.vsb -orient vertical -command "$w.tree yview"
scrollbar $w.hsb -orient horizontal -command "$w.tree xview"
}
pack $w.container -fill both -expand 1
grid $w.tree $w.vsb -in $w.container -sticky nsew
grid $w.hsb -in $w.container -sticky nsew
grid column $w.container 0 -weight 1
grid row $w.container 0 -weight 1
## The data we're going to insert
set data {
Argentina {Buenos Aires} ARS
Australia Canberra AUD
Brazil Brazilia BRL
Canada Ottawa CAD
China Beijing CNY
France Paris EUR
Germany Berlin EUR
India {New Delhi} INR
Italy Rome EUR
Japan Tokyo JPY
Mexico {Mexico City} MXN
Russia Moscow RUB
{South Africa} Pretoria ZAR
{United Kingdom} London GBP
{United States} {Washington, D.C.} USD
}
## Code to insert the data nicely
set font [ttk::style lookup [$w.tree cget -style] -font]
foreach col {country capital currency} name {Country Capital Currency} {
$w.tree heading $col -command [list SortBy $w.tree $col 0] -text $name
$w.tree column $col -width [font measure $font $name]
}
foreach {country capital currency} $data {
$w.tree insert {} end -values [list $country $capital $currency]
foreach col {country capital currency} {
set len [font measure $font "[set $col] "]
if {[$w.tree column $col -width] < $len} {
$w.tree column $col -width $len
}
}
}
## Code to do the sorting of the tree contents when clicked on
proc SortBy {tree col direction} {
# Build something we can sort
set data {}
foreach row [$tree children {}] {
lappend data [list [$tree set $row $col] $row]
}
set dir [expr {$direction ? "-decreasing" : "-increasing"}]
set r -1
# Now reshuffle the rows into the sorted order
foreach info [lsort -dictionary -index 0 $dir $data] {
$tree move [lindex $info 1] {} [incr r]
}
# Switch the heading so that it will sort in the opposite direction
$tree heading $col -command [list SortBy $tree $col [expr {!$direction}]]
}
|