2017-05-02 23 views
0

,具有一定的可膨脹子樹,並選擇更改的偵聽器:防止TTK ::從樹狀選擇上展開/摺疊所以我有一個簡單的樹狀子樹

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會如果用戶嘗試展開/摺疊子樹(通過單擊節點元素左側的擴展器圖標),自動(除)選擇子樹節點(「節點0」和「節點1」),並調用偵聽器。

有沒有什麼辦法可以在不同時選擇項目的情況下允許子樹的擴展/縮放?我的開發平臺是Tcl/Tk-8.6(在Debian/stretch上),但任何解決方案都應該跨平臺工作。

回答

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

雖然我不太明白,爲什麼如果oldsel不是空的,跳過跳過(因爲如果當前有* no *選擇,這仍然會出現問題)。當然,您可以將'TreeviewOpen'和'TreeviewClose'綁定到同一個處理程序中... –

+0

第一次不能將選擇設置爲{}(不存在,skip爲false)。當然,如果將'oldsel'初始化爲默認選擇,則不需要該測試。 –