wxPython:TreeCtrl:如何按名称获取树项目?

wxPython:TreeCtrl:如何按名称获取树项目?,python,tree,wxpython,Python,Tree,Wxpython,我正在使用wxPython,得到了一个包含一些项目的树。 现在我需要一个函数,它按名称给我树项对象 例如: item=self.GetItemByNameMyStories 我在文档中找不到这样的功能 有人有什么想法吗?这里有一种方法可以找到第一个带有特定标签的树项目: def get_item_by_label(self, tree, search_text, root_item): item, cookie = tree.GetFirstChild(root_item) w

我正在使用wxPython,得到了一个包含一些项目的树。 现在我需要一个函数,它按名称给我树项对象

例如: item=self.GetItemByNameMyStories

我在文档中找不到这样的功能


有人有什么想法吗?

这里有一种方法可以找到第一个带有特定标签的树项目:

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查找比我刚才键入的要快得多,看起来更干净。

这里有一种方法可以找到第一个带有特定标签的树项:

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查找比我刚才键入的更快、更干净。

虽然robots.jpg答案会起作用,但我发现更好的解决方案是在dict中跟踪ID,如@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
然后,当您需要查找某个对象的项时,您只需获取树id即可

tree_id = self.tree_item_ids[obj.name]
data = self.tree.GetPyData(tree_id)

虽然robots.jpg的答案会起作用,但我发现更好的解决方案是在dict中跟踪ID,如@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
然后,当您需要查找某个对象的项时,您只需获取树id即可

tree_id = self.tree_item_ids[obj.name]
data = self.tree.GetPyData(tree_id)

您还可以覆盖TreeCtrl并使用self更改tree\u ctrl\u实例


您还可以覆盖TreeCtrl并使用self更改tree\u ctrl\u实例


我不认为节点包含名称,只包含标签,所以你想通过它获取一个项目吗?你能给出一个你想要实现什么的示例代码吗?我不认为节点包含名称,只包含标签,所以你想通过它获取一个项目吗?你能给出一个你想要实现什么的示例代码吗?是的,添加calling tree.AppendItem会返回一个wx.TreeItemId-更容易跟踪这些。是的,添加calling tree.AppendItem会返回一个wx.TreeItemId-更容易跟踪这些。tree\u id=self.tree\u item\u id[obj.name],使用AppendItem时,可以直接将此树id作为父对象传入。data=self.tree.GetPyDatatree_id对我来说失败。使用wx.lib.agw.customtreectrl和AppendItem返回一个对象引用,例如。因此,它不是wx.TreeItemId,但此方法仍能正常工作。tree\u id=self.tree\u item\u id[obj.name],使用AppendItem时,此tree\u id可以直接作为父对象传入。data=self.tree.GetPyDatatree_id对我来说失败。使用wx.lib.agw.customtreectrl和AppendItem返回一个对象引用,例如。因此它不是wx.TreeItemId,但这种方法仍然很有效。