[英]wxPython: TreeCtrl: How can I get a tree item by name?
我正在使用wxPython,並得到了帶有某些項目的樹。 現在,我需要一個函數,該函數按名稱為我提供樹項對象。
例如:item = self.GetItemByName(“ MyStories”)
我在文檔中找不到此類功能。
有人有什么想法嗎?
這是查找帶有特定標簽的第一個樹項的一種方法:
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
然后,當您需要查找對象的項目時,只需抓住tree_id
tree_id = self.tree_item_ids[obj.name]
data = self.tree.GetPyData(tree_id)
您也可以覆蓋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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.