CheckListCtrl and OnCheckItem

Hi all,

I have a problem with the new CheckListCtrl and OnCheckItem.
How can I use the OnCheckItem method as an event?

I will use OnCheckItem not in the subclass for CheckListCtrl:

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin):
     def __init__(self, parent, log):
         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT)
         CheckListCtrlMixin.__init__(self)
         self.log = log
         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)

     def OnItemActivated(self, evt):
         self.ToggleItem(evt.m_itemIndex)

     # this is called by the base class when an item is checked/unchecked

     def OnCheckItem(self, index, flag):
         data = self.GetItemData(index)
         title = musicdata[data][1]
         if flag:
             what = "checked"
         else:
             what = "unchecked"
         self.log.write('item "%s", at index %d was %s\n' % (title, index, what))

class TestPanel(wx.Panel):
     def __init__(self, parent, log):
         self.log = log
         wx.Panel.__init__(self, parent, -1)

         self.list = CheckListCtrl(self, log)
         sizer = wx.BoxSizer()
         sizer.Add(self.list, 1, wx.EXPAND)
         self.SetSizer(sizer)

         self.list.InsertColumn(0, "Artist")
         self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT)
         self.list.InsertColumn(2, "Genre")

         for key, data in musicdata.iteritems():
             index = self.list.InsertStringItem(sys.maxint, data[0])
             self.list.SetStringItem(index, 1, data[1])
             self.list.SetStringItem(index, 2, data[2])
             self.list.SetItemData(index, key)

         self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
         self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
         self.list.SetColumnWidth(2, 100)

         self.list.CheckItem(4)
         self.list.CheckItem(7)

         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)

     def OnItemSelected(self, evt):
         self.log.write('item selected: %s\n' % evt.m_itemIndex)

     def OnItemDeselected(self, evt):
         self.log.write('item deselected: %s\n' % evt.m_itemIndex)

---> This is the place, where I will use the OnCheckItem as a event handler.

How can I do this?

Thanks Andreas

Hi again,

I was able to solve the problem by myself.

Andreas Kaiser wrote:

Hi all,

I have a problem with the new CheckListCtrl and OnCheckItem.
How can I use the OnCheckItem method as an event?

I will use OnCheckItem not in the subclass for CheckListCtrl:

class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin):
     def __init__(self, parent, log):
         wx.ListCtrl.__init__(self, parent, -1, style=wx.LC_REPORT)
         CheckListCtrlMixin.__init__(self)
         self.log = log
         self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)

     def OnItemActivated(self, evt):
         self.ToggleItem(evt.m_itemIndex)

1. delete this part in the subclass:

···

---------------------------------------------

     # this is called by the base class when an item is checked/unchecked
     def OnCheckItem(self, index, flag):
         data = self.GetItemData(index)
         title = musicdata[data][1]
         if flag:
             what = "checked"
         else:
             what = "unchecked"
         self.log.write('item "%s", at index %d was %s\n' % (title, index, what))

---------------------------------------------

class TestPanel(wx.Panel):
     def __init__(self, parent, log):
         self.log = log
         wx.Panel.__init__(self, parent, -1)

         self.list = CheckListCtrl(self, log)
         sizer = wx.BoxSizer()
         sizer.Add(self.list, 1, wx.EXPAND)
         self.SetSizer(sizer)

         self.list.InsertColumn(0, "Artist")
         self.list.InsertColumn(1, "Title", wx.LIST_FORMAT_RIGHT)
         self.list.InsertColumn(2, "Genre")

         for key, data in musicdata.iteritems():
             index = self.list.InsertStringItem(sys.maxint, data[0])
             self.list.SetStringItem(index, 1, data[1])
             self.list.SetStringItem(index, 2, data[2])
             self.list.SetItemData(index, key)

         self.list.SetColumnWidth(0, wx.LIST_AUTOSIZE)
         self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
         self.list.SetColumnWidth(2, 100)

         self.list.CheckItem(4)
         self.list.CheckItem(7)

         self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected, self.list)
         self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected, self.list)

Add this in the init section of your program:
--------------------------------------------------------
            self.list.OnCheckItem = self.OnCheckItem
--------------------------------------------------------

     def OnItemSelected(self, evt):
         self.log.write('item selected: %s\n' % evt.m_itemIndex)

     def OnItemDeselected(self, evt):
         self.log.write('item deselected: %s\n' % evt.m_itemIndex)

---> This is the place, where I will use the OnCheckItem as a event handler.

Add here your own OnCheckItem method:
--------------------------------------------------------
        def OnCheckItem(self, index, flag):
            data = self.list.GetItemData(index)
            title = musicdata[data][1]
            if flag:
                what = "checked"
            else:
                what = "unchecked"
            self.log.write('item "%s", at index %d was %s\n' % (title,
   index, what))
--------------------------------------------------------

So, everything is working fine!

Andreas