Jak mogę sprawdzić, czy określony root w obiekcie wx.treectrl ma pewne dziecko, czy nie?

Piszę funkcje ręczne, aby zaktualizować Treectrl za każdym razem, gdy dziecko jest dodawane przez użytkownika. Jest jakiś sposób na zautomatyzowanie tego?

0
user845459 27 październik 2011, 21:36

3 odpowiedzi

Najlepsza odpowiedź

Możesz rozważyć przechowywanie danych w innej łatwo przeszukiwalnej strukturze i za pomocą TreeCtrl, aby go wyświetlić. W przeciwnym razie możesz iterować nad dziećmi TreeCtrl Root Element takie jak:

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())

Odciekowe komentowane linie sprawią, że wyszukiwanie rekurencyjne.

1
robots.jpg 28 październik 2011, 20:45

Ładującym sposobem obsługi przechodzenia do drzewa rekurencyjnego jest owijanie go w obiekcie generatora, który można następnie ponownie użyć, aby wykonać dowolną operację na węzłach drzewa:

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
0
ali_m 17 luty 2013, 03:24

Do wyszukiwania przez tekst bez rekurencji:

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
obayhan 3 maj 2016, 14:04