wxPython: TreeCtrl: 如何通过名称获取树项?

1 投票
3 回答
5125 浏览
提问于 2025-04-16 22:57

我正在使用wxPython,创建了一个树形结构,上面有一些项目。现在我需要一个函数,能够通过名称找到树形结构中的项目对象。

比如说,我想用下面的代码来获取一个名为"MyStories"的项目:

item = self.GetItemByName("MyStories")

但是在文档里我找不到这样的函数。

有没有人有什么想法?

3 个回答

0

你也可以重写 TreeCtrl,并用 self 来替换 tree_ctrl_instance

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
4

虽然robots.jpg的回答可以解决问题,但我发现一个更好的办法是用字典来跟踪这些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

然后当你需要查找某个对象的项目时,只需获取tree_id就可以了。

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

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

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已经提供了工具,可以在树形项目和其他对象之间建立双向引用,这样在填充树形结构时会更方便。而且,使用字典查找比我刚才写的方式要快得多,看起来也更整洁。

撰写回答