Поиск определенного дочернего элемента в wxTreeCtrl и обновление TreeCtrl в wxPython

#python #wxpython

#python #wxpython

Вопрос:

Как я могу проверить, имеет ли определенный корень в объекте wx.TreeCtrl определенного дочернего элемента или нет?

Я пишу ручные функции для обновления TreeCtrl каждый раз, когда пользователь добавляет дочерний элемент.Есть ли способ автоматизировать это?

Ответ №1:

Возможно, вы захотите сохранить данные в какой-либо другой структуре, доступной для поиска, и использовать TreeCtrl just для их отображения. В противном случае вы можете выполнить итерацию по дочерним элементам 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())
 

Раскомментирование закомментированных строк сделает его рекурсивным поиском.

Ответ №2:

Более удобный способ обработки рекурсивного обхода дерева — обернуть его в объект генератора, который затем можно повторно использовать для выполнения любых операций, которые вам нравятся на ваших узлах дерева:

 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
 

Ответ №3:

Для поиска по тексту без рекурсии :

 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
 

Комментарии:

1. Похоже, это не работает для меня. root_list = [tree_ctrl_instance. GetRootItem()] Предполагается ли, что это возвращает список всех элементов в дереве?