我正在使用wxPython并获得了一些包含一些项目的树。 现在我需要一个按名称给我树项目对象的函数。
例如: item = self.GetItemByName(“MyStories”)
我在文档中找不到这样的功能。
有没有人有任何想法?
答案 0 :(得分:5)
以下是查找具有特定标签的第一个树项目的一种方法:
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查找比我刚输入的更快更清晰。
答案 1 :(得分:4)
虽然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
然后当你需要查找对象的项目时,你可以抓住tree_id
tree_id = self.tree_item_ids[obj.name]
data = self.tree.GetPyData(tree_id)
答案 2 :(得分:0)
你也可以覆盖TreeCtrl并用 self
更改 tree_ctrl_instancedef 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