wx.Treectrl 项目查找表
我正在尝试创建一个查找表,把 wxTreeItem
和一些对象连接起来。当我选择或双击这个项目时,应该对这个对象执行某个操作。奇怪的是,我发现通过 AppendItem
返回的项目实例,要么是添加到树中的真实项目的一个副本,要么是 self.tree.GetSelection()
和 event.GetItem()
返回的是这个项目的一个副本。
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()
有没有什么建议?有没有合适的方法可以在对树项目进行操作(比如鼠标点击或键盘操作)时,连接并访问相应的对象?
2 个回答
2
最好的方法就是把你的数据放进这个项目里,使用 SetItemData
:
item = self.tree.AppendItem(root, obj.name)
self.tree.SetItemData(item,obj)
然后,稍后你可以用 GetItemData
把数据从这个项目里提取出来。你几乎可以把任何东西放进去。
2
一个好的方法是
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()