从wxtreeCtrl获取选定项

1 投票
2 回答
3975 浏览
提问于 2025-04-17 04:58

你应该怎么获取在 wxTreeCtrl 中选中的项目呢?我把方法绑定到激活的项目上,像这样:

 self.tree.Bind (wx.EVT_TREE_ITEM_ACTIVATED, self.OnAdd, id=10)

然后在 OnAdd 方法中,我试着获取这个项目:

    def OnAdd(self, event):
        item =  event.GetItem()

但是它报错说事件没有 GetItem() 这个方法。有什么想法吗?

更新:

我给一个按钮事件分配了处理选中项目的功能。所以这就是为什么事件没有附带项目的原因……

2 个回答

0

我来分享一下我的看法:

我花了两天时间在找C++/wxWidgets的解决方案。

我找到一个非常好用的例子:

  1. 我在Ubuntu Bionic上使用Codeblocks和wxSmith(一个快速开发工具)。

  2. 从Windows远程连接,并设置显示,然后打开Codeblocks。

下面是这个特定事件的代码...

void test12052019Frame::OnTreeCtrl1ItemActivated(wxTreeEvent& event)
{
//TreeCtrl1 is my tree
//when I click on any option of my tree
//it activates a wxMessageBox with the label
//of the option selected...
//just let go your imagination :)
//A youtube video will follow.

wxString thelabel;
wxTreeItemId test3;

test3 = TreeCtrl1->GetSelection();//id of the item selected
thelabel = TreeCtrl1->GetItemText(test3);//extract associated text

wxMessageBox(thelabel); //shazam !


}

YouTube上的工作示例

0

你绑定回调函数的方式不对。你现在是这样做的:

self.Bind (wx.EVT_TREE_ITEM_ACTIVATED, self.OnAdd, id=10)

但是第三个参数应该是 source,而 id 是第四个参数。所以,改成这样:

self.tree = wx.TreeCtrl(self, size=(200,100)) # Or however you defined it
self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnAdd, self.tree, id=10)

这样的话,你在 OnAdd 函数中得到的 event 参数将是 tree 的实例,这样你就可以使用 GetItem 方法了。

完整示例:

import wx

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')
        for item in ['item1', 'item2', 'item3']:
            self.tree.AppendItem(root, item)
        self.Bind(wx.EVT_TREE_ITEM_ACTIVATED, self.OnActivated, self.tree)
        self.tree.Expand(root)

    def OnActivated(self, evt):
        print 'Double clicked on', self.tree.GetItemText(evt.GetItem())

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

撰写回答