2017-05-02 2 views
0

so habe ich eine einfache treeview, mit einigen erweiterbaren Unterbäumen, und ein Zuhörer für die Auswahl Änderungen kollabiert:verhindern ttk :: treeview von der Auswahl auf den Ausbau/Teilbäume

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" 

Es scheint, dass Tcl/Tk wird Wählen Sie automatisch einen Subtree-Knoten ("Node 0" bzw. "Node 1") und rufen Sie den Listener auf, wenn der Benutzer versucht, den Teilbaum zu expandieren (durch Klicken auf das Expander-Icon links vom Knotenelement).

Gibt es eine Möglichkeit, Erweiterung/Aufruf des Teilbaums zuzulassen, ohne das Element gleichzeitig auszuwählen?

Meine Dev-Plattform ist Tcl/Tk-8.6 (auf Debian/stretch), aber jede Lösung soll plattformübergreifend funktionieren.

Antwort

1

So etwas funktioniert.

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) {} 
+0

ich verstehe jedoch nicht wirklich, warum Sie das Überspringen überspringen, wenn das oldsel nicht leer ist (da dies immer noch das Problem zeigt, wenn es zur Zeit * keine * Auswahl gibt). und natürlich könnten Sie sowohl "TreeviewOpen" als auch "TreeviewClose" an denselben Handler binden ... –

+0

Die Auswahl kann nicht beim ersten Mal auf {} gesetzt werden (existiert nicht, skip ist falsch). Wenn Sie 'oldsel' auf eine Standardauswahl initialisieren, brauchen Sie diesen Test natürlich nicht. –

Verwandte Themen