#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()] Предполагается ли, что это возвращает список всех элементов в дереве?