阻止ttk :: treeview选择扩展/折叠子树

时间:2017-05-02 21:58:40

标签: treeview tk

所以我有一个简单的树视图,有一些可扩展的子树,以及一个用于选择更改的监听器:

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上),但任何解决方案都应该跨平台工作。

1 个答案:

答案 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) {}