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