首页 文章

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

提问于
浏览
0

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

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 回答

  • 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) {}
    

相关问题