wxPython: TreeCtrl: Как я могу получить элемент дерева по имени? - PullRequest
1 голос
/ 05 августа 2011

Я использую wxPython и получил дерево с некоторыми элементами.Теперь мне нужна функция, которая дает мне объект дерева по имени.

Например: item = self.GetItemByName ("MyStories")

Я не могу найти такую ​​функцию в документации.

У кого-нибудь есть идеи?

Ответы [ 3 ]

5 голосов
/ 06 августа 2011

Вот один из способов найти первый элемент дерева с определенной меткой:

def get_item_by_label(self, tree, search_text, root_item):
    item, cookie = tree.GetFirstChild(root_item)

    while item.IsOk():
        text = tree.GetItemText(item)
        if text.lower() == search_text.lower():
            return item
        if tree.ItemHasChildren(item):
            match = self.get_item_by_label(tree, search_text, item)
            if match.IsOk():
                return match
        item, cookie = tree.GetNextChild(root_item, cookie)

    return wx.TreeItemId()

result = get_item_by_label(tree, 'MyStories', tree.GetRootItem())
if result.IsOk():
    print('We have a match!')

Но в зависимости от того, что вы отображаете в дереве, возможно, есть более простой способ справиться с этим.TreeCtrl уже предоставляет инструменты для создания ссылок в обоих направлениях между элементами дерева и другими объектами при заполнении дерева, и поиск в режиме dict выглядит намного быстрее и чище, чем то, что я только что набрал.

4 голосов
/ 14 августа 2012

Хотя ответ robots.jpg будет работать, но я считаю, что гораздо лучшее решение состоит в том, чтобы отслеживать идентификаторы, как показано ниже (на что намекает @ robots.jpg & @Steven Sproat)

self.tree_item_ids = {}
root = self.tree.GetRootItem()
for obj in objs_to_add:
    tree_id = self.tree.AppendItem(root,obj.name)
    self.tree_item_ids[obj.name] = tree_id

а затем позже, когда вам нужно найти предмет для объекта, вы можете просто взять tree_id

tree_id = self.tree_item_ids[obj.name]
data = self.tree.GetPyData(tree_id)
0 голосов
/ 03 мая 2016

Вы также можете переопределить TreeCtrl и изменить tree_ctrl_instance на self

def GetItemByName(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...