def combobox(element, instance: wx.ComboBox) -> wx.Object: props = exclude(element['props'], {'value'}) # ComboBox is a textctrl and listbox linked together. # Updating one causes events to fire for the other, so # to avoid doubling up the events, we unhook everything, # perform the updates, and then re-add the handlers. instance.Unbind(wx.EVT_COMBOBOX) instance.Unbind(wx.EVT_TEXT) set_basic_props(instance, props) # we blanket delete/recreate the items for now, which # seems to be Good Enough. Child diffing could be benchmarked # to see if it's worth the effort. for _ in instance.GetItems(): instance.Delete(0) instance.AppendItems(props.get('choices', [])) if 'value' in props: instance.SetSelection(props['choices'].index(element['props'].get('value'))) if props.get('on_change'): instance.Bind(wx.EVT_COMBOBOX, props['on_change']) if props.get('on_input'): instance.Bind(wx.EVT_TEXT, props['on_input']) return instance
def crt_combobox(self, choices, size=(-1, -1), event_handler=None): combobox = ComboBox(self, choices=choices, size=size, style=wx.CB_READONLY) if event_handler is not None: combobox.Bind(wx.EVT_COMBOBOX, event_handler) return combobox