2011-08-05 18 views
1

我正在使用wxPython,並得到了一些項目的樹。 現在我需要一個按名稱給我樹項目對象的函數。wxPython:TreeCtrl:如何通過名稱獲取樹項目?

例如: 項= self.GetItemByName( 「MyStories」)

我無法找到的文檔中這樣的功能。

有沒有人有任何想法?

+1

我不認爲節點包含名稱,只有標籤,所以你想獲得一個項目呢? –

+0

你能給出一個你想要達到什麼樣的代碼嗎? – Bogdan

回答

4

這裏有一種方法與特定的標籤,找到第一個樹項目:

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已經提供了一些工具,用於在填充樹時在樹項和其他對象之間創建引用的方式,並且字典查找比我剛纔輸入的要快得多和清晰。

+0

是的,添加調用tree.AppendItem()返回一個wx.TreeItemId - 更容易跟蹤這些。 –

2

雖然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) 
+0

tree_id = self.tree_item_ids [obj.name],當使用AppendItem時,可以直接將此tree_id作爲父對象傳入。 data = self.tree.GetPyData(tree_id)失敗了。 – bud

+0

使用'wx.lib.agw.customtreectrl'和'AppendItem'返回一個對象引用(例如'')。所以它不是'wx.TreeItemId',但這種方法仍然有效。 – starfry

0

您也可以覆蓋TREECTRL和改變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