4

我正在使用以下方法迭代 wxpython treectrl 的所有节点。

 def get_desired_parent(self, name, selectednode = None):
    if selectednode == None:
        selectednode = self.treeCtrl.RootItem
    # First perform the action on the first object separately
    childcount = self.treeCtrl.GetChildrenCount(selectednode, False)
    if childcount == 0:
        return None

    (item,cookie) = self.treeCtrl.GetFirstChild(selectednode)
    if self.treeCtrl.GetItemText(item) == name:
        return item

    while childcount > 1:
        childcount = childcount - 1
     # Then iterate over the rest of objects
        (item,cookie) = self.treeCtrl.GetNextChild(item,cookie)
        if self.treeCtrl.GetItemText(item) == name:
            return item
    return None

当我在结构中递归迭代时,这个多余代码的问题变得更加明显。是否有另一种以更紧凑的方式执行相同操作的方法,以使我的代码更简洁/pythonic。

4

3 回答 3

5

您可以使用此函数内部的一个函数(仅在其命名空间中),该函数将检查它是否与条件匹配。如果它确实返回了该项目,如果没有,则继续。

否则,您可以在下线后检查您的状况while。这样,item变量将由循环之前的第一个孩子定义,并像其他任何孩子一样进行评估。

还有一种方式:(或两者的混合)

(child, cookie) = self.GetFirstChild(item)
while child.IsOk():
    do_something(child)
     (child, cookie) = self.GetNextChild(item, cookie)
于 2012-04-18T08:19:12.150 回答
0

这是一个完整的示例,它首先遍历树的深度。该功能绑定到右键。

def OnRightDown(self, event):
    def showChildren(item,cookie):
        # functions goes recursively down the tree
        if item.IsOk():
            child, cookie = self.tree.GetFirstChild(item)
            while child.IsOk():
                child, cookie = self.tree.GetNextChild(child, cookie)
                if child:
                  print(self.tree.GetItemText(child)) #show child label name
                  showChildren(child,cookie)
    pt = event.GetPosition()
    item, flags = self.tree.HitTest(pt)
    if item:
        print(self.tree.GetItemText(item)) #show parent label name
        showChildren(item,0)  #iterate depth first into the tree
于 2020-11-07T08:37:51.613 回答
0

在这里使您的代码具有高度可读性的最佳方法是使其简短且功能强大。

如果您需要遍历所有树项并首先通过深度进行。这是一个单一的快速功能。给它一个获取每个项目的函数,以及你从哪里开始(通常是 self.root)。它也非常可重用,因为您可能会经常这样做。

    def depth_first_tree(self, funct, item):
        (child, cookie) = self.tree.GetFirstChild(item)
        while child.IsOk():
            self.depth_first_tree(funct, child)
            funct(child)
            (child, cookie) = self.tree.GetNextChild(item, cookie)
于 2021-11-08T13:56:22.987 回答