Problem
I want to generate an wxEVT_COMMAND_LISTBOX_SELECT event by hand.
Context
I am using wxPython on Debian Gnu/Linux (unstable). The relevant packages are:
- libwxgtk2.5-python version 2.5.3.1
- wxwin2.5-examples version 2.5.3.1
The documentation that I refer to below is part of the libwxgtk2.5-python package and lives in my computer on /usr/share/doc/wxwin2.5-doc/wxWindows-manual.html/.
My path to the solution (and some problems left behind)
My documentation does not say that wxListBox inherits from wxControl, but it does (or it appears to). This appears to be a documentation bug.
So, the method wxListBox.Command exists. The docs on wxControl say that wxControl::wxCommand is like
void Command(wxCommandEvent& event)
The next problem is to generate an wxCommandEvent instance. The docs say that the constructor of wxCommandEvent is like
wxCommandEvent(WXTYPE commandEventType = 0, int id = 0)
To retrieve the EventType for an event type you can do :
yourPyEventBinder.evtType[0]
The solution
All of the above put together, the line that produces an EVT_LISTBOX event is:
self.Command(wx.wxCommandEvent(wx.EVT_LISTBOX.evtType[0], self.GetId()))
where self is the wxListBox instance.
To do
- Make documentation patches.
Update this recipe with the info present in the wxPython-users mailing list.
Example
This example demonstrates a simple window with a button, combo box, and text field. Pushing the button creates a CommandEvent and tells the combo box to process it. The event contains client data, as well.
import wx class TestPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent) btn = wx.Button(self, label="create event") btn.Bind(wx.EVT_BUTTON, self.OnButton) self.CB = wx.ComboBox(self, style=wx.CB_READONLY) self.CB.Append('one', '1') self.CB.Append('two', '2') self.CB.Bind(wx.EVT_COMBOBOX, self.OnCombo) self.text= wx.TextCtrl(self, style=wx.TE_READONLY) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(btn, 0, wx.ALL, 10) sizer.Add(self.CB, 0, wx.LEFT | wx.RIGHT , 10) sizer.Add(self.text, 0, wx.ALL, 10) self.SetSizerAndFit(sizer) def OnButton(self, event): e = wx.CommandEvent(wx.EVT_COMBOBOX.evtType[0], self.CB.GetId() ) e.SetString('three') e.SetClientData('3') self.CB.Command(e) def OnCombo(self,event): self.text.SetValue("%s %s" % (event.GetString(), event.GetClientData())) class TestFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent) sizer = wx.BoxSizer(wx.VERTICAL) self.NB = TestPanel(self) sizer.Add(self.NB, 1, wx.EXPAND | wx.GROW) self.SetSizerAndFit(sizer) self.Layout() from wx.lib.mixins.inspection import InspectionMixin class App(wx.App, InspectionMixin): def OnInit(self): self.Init() frame = TestFrame(None) self.SetTopWindow(frame) frame.Show(True) return True app = App(0) app.MainLoop() app.Destroy()
The only problem with this code is the generated event won't change the value in the combo box.