所以我有一个简单的树视图,有一些可扩展的子树,以及一个用于选择更改的监听器:
ttk::treeview .tree
pack .tree -expand 1 -fill both
.tree tag configure disabled -foreground grey
.tree tag bind all <<TreeviewSelect>> "puts selected"
set node [.tree insert {} end -text "Node 0" -tags all]
.tree insert $node end -text "A" -tags "all"
.tree insert $node end -text "B" -tags "all"
.tree insert $node end -text "C" -tags "all"
set node [.tree insert {} end -text "Node 1" -tags all -open 1]
.tree insert $node end -text "X" -tags "all"
.tree insert $node end -text "Y" -tags "all"
.tree insert $node end -text "Z" -tags "all"
如果用户尝试展开/折叠子树,tcl / tk似乎会自动(de)选择子树节点(“Node 0”resp“Node 1”)并调用<<TreeviewSelect>>
侦听器(通过单击节点元素左侧的Expander图标)。
有没有办法在不同时选择项目的情况下允许扩展/缩放子树?
我的开发平台是Tcl / Tk-8.6(在Debian / stretch上),但任何解决方案都应该跨平台工作。
答案 0 :(得分:1)
像这样的东西。
package require Tk
variable vars
proc sel { args } {
variable vars
if { $vars(skip) && $vars(oldsel) ne {} } {
.tree selection set $vars(oldsel)
set vars(skip) false
return
}
set vars(skip) false
set vars(oldsel) [.tree selection]
}
proc op { args } {
variable vars
set vars(skip) true
}
proc cl { args } {
variable vars
set vars(skip) true
}
ttk::treeview .tree
set id1 [.tree insert {} end -id id1 -text id1]
set id1-1 [.tree insert $id1 end -id id1-1 -text id1-1]
set id1-2 [.tree insert $id1 end -id id1-2 -text id1-2]
set id2 [.tree insert {} end -id id2 -text id2]
set id2-1 [.tree insert $id2 end -id id2-1 -text id2-1]
set id2-2 [.tree insert $id2 end -id id2-2 -text id2-2]
bind .tree <<TreeviewSelect>> sel
bind .tree <<TreeviewOpen>> op
bind .tree <<TreeviewClose>> cl
pack .tree
set vars(oldsel) {}