如何在wxpython中获取customtreectrl的检查项?

如何在wxpython中获取customtreectrl的检查项?,wxpython,Wxpython,我正在GUI中使用customtreectrl。customtreectrl的项目带有一个复选框。我想从customtreectrl获取已检查的项目。我还想得到那些项目,这是未经检查和之前,他们被检查。Customtreecontrol可以提供使用GetSelection()或GetSelections()方法选择的项目,但没有用于获取选中项目的方法。我提出了以下解决方案: 但有一个问题是,即使我检查了customtreectrl的一些项目,ItemChecked(self,event)方法中的

我正在GUI中使用customtreectrl。customtreectrl的项目带有一个复选框。我想从customtreectrl获取已检查的项目。我还想得到那些项目,这是未经检查和之前,他们被检查。Customtreecontrol可以提供使用GetSelection()或GetSelections()方法选择的项目,但没有用于获取选中项目的方法。我提出了以下解决方案: 但有一个问题是,即使我检查了customtreectrl的一些项目,ItemChecked(self,event)方法中的if条件也从未达到。换句话说,无论customtreectrl项是否已检查,event.IsChecked()始终返回False。任何帮助都将不胜感激。

Andrea Gavana(CustomTreeCtrl的创建者)实际上在wxPython邮件列表中编写了一个小函数,您可以使用它来完成这项工作:

我以您在问题中链接的示例为例,将其与Andrea的代码结合起来,得出以下示例:

import wx
import wx.lib.agw.customtreectrl as CT

########################################################################
class MyCustomTree(CT.CustomTreeCtrl):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent, *args, **kw):
        """"""
        CT.CustomTreeCtrl.__init__(self, parent, *args, **kw)

    def GetCheckedItems(self, itemParent=None, checkedItems=None):
        if itemParent is None:
            itemParent = self.GetRootItem()

        if checkedItems is None:
            checkedItems = []

        child, cookie = self.GetFirstChild(itemParent)

        while child:

            if self.IsItemChecked(child):
                checkedItems.append(child)

            checkedItems = self.GetCheckedItems(child, checkedItems)
            child, cookie = self.GetNextChild(itemParent, cookie)

        return checkedItems

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "CustomTreeCtrl Demo")
        panel = wx.Panel(self)

        custom_tree = MyCustomTree(panel)
        self.custom_tree = custom_tree
        root = custom_tree.AddRoot("The Root Item")

        for y in range(5):
            last = custom_tree.AppendItem(root, "item %d" % y)

            for z in range(5):
                item = custom_tree.AppendItem(last,  "item %d" % z, ct_type=1)

            self.Bind(CT.EVT_TREE_ITEM_CHECKED, self.ItemChecked)

        btn = wx.Button(panel, label="Find Checked Items")
        btn.Bind(wx.EVT_BUTTON, self.getCheckedItems)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(custom_tree, 1, wx.EXPAND)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)

    def ItemChecked(self, event):
        print("Somebody checked something")

    #----------------------------------------------------------------------
    def getCheckedItems(self, event):
        """"""
        checked_items = self.custom_tree.GetCheckedItems()
        for item in checked_items:
            print item.GetText()


if __name__ == '__main__':
    app = wx.App(False)
    frame = MyFrame(None)
    frame.Show()
    app.MainLoop()

这对我很有效。

我也遇到了类似的问题,event.IsChecked()总是返回False。问题已通过event.GetItem()解决。IsChecked()