Buenas, vi este ejemplo:
http://wiki.wxpython.org/Combo%20Box%20that%20Suggests%20Options
Se puede adaptar ese ejemplo para que la lista de datos sea leída de una tabla de una base de datos?
Es decir, supongo que sería primero leer la tabla de la base de datos y cargarla en una lista (de nombre choices en nuestro ejemplo), luego ordenarla y recién allí aplicar el resto del código eliminando la línea
choices = ['grandmother', 'grandfather', 'cousin', 'aunt', 'uncle', 'grandson', 'granddaughter']
lo que no entiendo es que hacer con
for relative in ['mother', 'father', 'sister', 'brother', 'daughter', 'son']:
choices.extend(self.derivedRelatives(relative))
Código:
import wx
class PromptingComboBox(wx.ComboBox) :
def __init__(self, parent, value, choices=[], style=0, **par):
wx.ComboBox.__init__(self, parent, wx.ID_ANY, value, style=style|wx.CB_DROPDOWN, choices=choices, **par)
self.choices = choices
self.Bind(wx.EVT_TEXT, self.EvtText)
self.Bind(wx.EVT_CHAR, self.EvtChar)
self.Bind(wx.EVT_COMBOBOX, self.EvtCombobox)
self.ignoreEvtText = False
def EvtCombobox(self, event):
self.ignoreEvtText = True
event.Skip()
def EvtChar(self, event):
if event.GetKeyCode() == 8:
self.ignoreEvtText = True
event.Skip()
def EvtText(self, event):
if self.ignoreEvtText:
self.ignoreEvtText = False
return
currentText = event.GetString()
found = False
for choice in self.choices :
if choice.startswith(currentText):
self.ignoreEvtText = True
self.SetValue(choice)
self.SetInsertionPoint(len(currentText))
self.SetMark(len(currentText), len(choice))
found = True
break
if not found:
event.Skip()
class TrialPanel(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent, wx.ID_ANY)
choices = ['grandmother', 'grandfather', 'cousin', 'aunt', 'uncle', 'grandson', 'granddaughter']
for relative in ['mother', 'father', 'sister', 'brother', 'daughter', 'son']:
choices.extend(self.derivedRelatives(relative))
cb = PromptingComboBox(self, "default value", choices, style=wx.CB_SORT)
def derivedRelatives(self, relative):
return [relative, 'step' + relative, relative + '-in-law']
if __name__ == '__main__':
app = wx.App()
frame = wx.Frame (None, -1, 'Demo PromptingComboBox Control', size=(400, 50))
TrialPanel(frame)
frame.Show()
app.MainLoop()