2013-05-09 77 views
0

一個TTK :: TreeView的是有一個簡單的方法來遍歷一個Tcl/Tk的ttk::treview的項目,好像他們是在一個列表框的項目?例如:遍歷Tk的

   A 
      | |-- B 
    visit | | |-- C 
    order | | |-- D   ----> A B C D E F G 
      | E 
      V |-- F 
        |-- G 

據我所知,這將對應於遍歷序樹,這是,事實上,我目前的解決方案。因爲我確實有最大精度N一棵完整的樹,我可以這樣做:

foreach lev1 [.tree children {}] { 
    do_stuff $lev1 
    foreach lev2 [.tree children $lev1] { 
     do_stuff$lev2 
     foreach lev3 [.tree children $lev2] { 
      do_stuff $lev3 
       .... 
     } 
    } 
} 

,但我正在尋找一個更簡單的方法來做到這一點。

我曾考慮給每個節點添加一個標籤(說mytag),並使用:.tree tag has mytag來獲取所有節點的列表。問題是,AFAIK,由此產生的順序不能保證,我可能會以不同類型的訪問結束。

回答

3

遞歸遍歷應該做的伎倆爲您服務。東西沿線

proc traverse {item} { 
    do_stuff $item 
    foreach [.tree children $item] { 
     traverse $item 
    } 
} 


.tree traverse {} 

感覺相當簡單了。

(聲明:我沒有實際測試過這一點)

+0

感謝@nurdglaw。是的,它會解決遍歷問題,基本上我在做什麼,除了我的樹具有已知的深度,因此我可以對「遞歸展開」進行排序。我希望我可以利用這個事實,即小部件已經按照我需要的順序擁有了元素,如果有一個小部件函數按照該順序遍歷樹,它會簡單得多。 – 2013-05-09 20:02:18

+0

我想如果有一些小部件函數按順序返回所有項目,但沒有一個,那會更容易。對於我的錢,你的「展開遞歸」使代碼變得簡單,但我想這是一個品味的問題。如果你需要在很多地方進行這種遍歷,你可以在你自己的類中包裝ttk :: notebook並添加一個成員函數來返回所有的項目,然後遍歷它返回「doing_stuff」的列表。 – nurdglaw 2013-05-09 20:38:02

+0

@ Remo.D如果您使用的是8.6,它會在內部爲您「展開遞歸」。但是對於樹的任何理智的深度來說,這並不重要。畢竟,「嘗試可能工作的最簡單的東西」是軟件工程的經典原理。 – 2013-05-10 07:54:35