2013-05-09 36 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