在wxPython中查找wxTreeCtrl中的特定子项并更新TreeCtrl

0 投票
3 回答
3351 浏览
提问于 2025-04-17 05:07

我怎么能检查一个wx.TreeCtrl对象里的某个根节点是否有特定的子节点呢?

我正在写一些手动的函数,每次用户添加子节点的时候更新TreeCtrl。有没有办法让这个过程自动化呢?

3 个回答

0

这里是一个不使用递归的方法来进行文本搜索:

def GetItemByText(self, search_text, tree_ctrl_instance):
        retval = None
        root_list = [tree_ctrl_instance.GetRootItem()]
        for root_child in root_list:
            item, cookie = tree_ctrl_instance.GetFirstChild(root_child)
            while item.IsOk():
                if tree_ctrl_instance.GetItemText(item) == search_text:
                    retval = item
                    break
                if tree_ctrl_instance.ItemHasChildren(item):
                    root_list.append(item)
                item, cookie = tree_ctrl_instance.GetNextChild(root_child, cookie)
        return retval
0

处理递归树遍历的一个更好的方法是把它放在一个生成器对象里。这样你就可以重复使用这个生成器,对树的节点进行你想要的任何操作。

def walk_branches(tree,root):
    """ a generator that recursively yields child nodes of a wx.TreeCtrl """
    item, cookie = tree.GetFirstChild(root)
    while item.IsOk():
        yield item
        if tree.ItemHasChildren(item):
            walk_branches(tree,item)
        item,cookie = tree.GetNextChild(root,cookie)

for node in walk_branches(my_tree,my_root):
    # do stuff
1

你可以考虑把数据存储在其他更容易搜索的结构里,然后用 TreeCtrl 来显示这些数据。否则,你可以像下面这样遍历 TreeCtrl 的根项下的所有子项:

def item_exists(tree, match, root):
    item, cookie = tree.GetFirstChild(root)

    while item.IsOk():
        if tree.GetItemText(item) == match:
            return True
        #if tree.ItemHasChildren(item):
        #    if item_exists(tree, match, item):
        #        return True
        item, cookie = tree.GetNextChild(root, cookie)
    return False

result = item_exists(tree, 'some text', tree.GetRootItem())

把注释掉的行去掉,就可以实现递归搜索了。

撰写回答