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.
