防止 ttk::treeview 选择 expanding/collapsing 个子树
prevent ttk::treeview from selecting on expanding/collapsing subtrees
所以我有一个简单的树视图,有一些可扩展的子树,还有一个 selection 变化的监听器:
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)select 一个子树节点 ("Node 0" resp "Node 1") 并调用 <<TreeviewSelect>>
侦听器,如果用户尝试 expand/collapse 子树(通过单击节点元素左侧的扩展器图标)。
有什么方法可以允许 expansion/callapsing 子树而不同时 selecting 项目吗?
我的开发平台是 Tcl/Tk-8.6(在 Debian/stretch 上),但任何解决方案都应该跨平台工作。
像这样的东西行得通。
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) {}
所以我有一个简单的树视图,有一些可扩展的子树,还有一个 selection 变化的监听器:
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)select 一个子树节点 ("Node 0" resp "Node 1") 并调用 <<TreeviewSelect>>
侦听器,如果用户尝试 expand/collapse 子树(通过单击节点元素左侧的扩展器图标)。
有什么方法可以允许 expansion/callapsing 子树而不同时 selecting 项目吗?
我的开发平台是 Tcl/Tk-8.6(在 Debian/stretch 上),但任何解决方案都应该跨平台工作。
像这样的东西行得通。
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) {}