wx.Treectrl 项目查找表

1 投票
2 回答
809 浏览
提问于 2025-04-17 22:07

我正在尝试创建一个查找表,把 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()

撰写回答