2014-03-13 81 views
1

我正在嘗試創建一個查找表,將wxTreeItem連接到對象。在選擇或雙擊該項目時,應該對該對象採取行動。 神祕地,我發現在AppendItem之後返回的物品實例是附加到樹上的真實物品的副本,或者self.tree.GetSelection()event.GetItem()返回有問題物品的副本。wx.Treectrl項目查找表

import wx 

class RandomObj(object): 
    def __init__(self, name): 
     self.name = name 

class TreeExample(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title='Tree Example', size=(200, 130)) 
     self.tree = wx.TreeCtrl(self, size=(200, 100)) 

     root = self.tree.AddRoot('root') 
     self.itemLUT = {} 
     for obj in [RandomObj('item1'), RandomObj('item2'), RandomObj('item3')]: 
      item = self.tree.AppendItem(root, obj.name) 
      print item 
      self.itemLUT[id(item)] = obj 
      self.itemLUT[id(obj)] = item 

     self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivated, self.tree) 
     self.tree.Expand(root) 

    def OnActivated(self, event): 
     item = event.GetItem() 
     print 'Double clicked on', self.tree.GetItemText(item) 
     print id(item) in self.itemLUT.keys() 
     print self.tree.GetSelection() 
     print item 

app = wx.PySimpleApp(None) 
TreeExample().Show() 
app.MainLoop() 

有什麼建議嗎?是否有任何適當的方式來連接和訪問一個對象的行爲(鼠標或鍵盤)上的一個樹項目。

回答

1

一個好辦法做到這一點是

item = self.tree.AppendItem(root, obj.name) 
self.tree.SetItemData(item, wx.TreeItemData(obj)) 

,並在事件方法

def OnActivated(self, event): 
    item = event.GetItem() 
    itemObject = self.tree.GetItemData(item).GetData() 
1

,最好的辦法就是把你的數據導入到項目與SetItemData

item = self.tree.AppendItem(root, obj.name) 
self.tree.SetItemData(item,obj) 

後來的後來,你可以使用GetItemData的數據中提取背出的項目。你可以把任何東西放在那裏。