En un post anterior
http://www.forosdelweb.com/f130/auto...tabla-1026959/ hice una consulta sobre como leer los datos de una tabla para tomarlos como sugerencia de autocompletar.
O sea, si en la tabla tengo el item BRASIL cuando el usuario digita B ya le aparezca la opción de seleccionar BRASIL o puede continuar escribiendo BOLIVIA (y en este último caso que la próxima vez que digite B le aparezcan las opciones de BRASIL y BOLIVIA).
Eso lo tengo resuelto para una entrada de texto indivivual. Por ejemplo algo del estilo:
Código Python:
Ver originalimport 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()
El tema es que en una interfase necesito que el usuario puede elegir hasta 10 items como estos, o sea, 10 items que pueden ser elementos que se autocompleten o elementos nuevos que se agreguen a las listas.
Las elecciones pueden ser repetidas o no, eso no importa.
En el código de ejemplo no se leen los datos de una fuente externa pero eso lo puedo resolver sin problema leyendo de un TXT, CSV o base de datos.
Las dudas que tengo son:
1) ¿Qué se estila en Python? ¿Un ComboBox diferente para cada vez que el usuario ingresa un dato o se puede de alguna manera combinar esto en un grid donde cada celda también despliegue las sugerencias de autocompletar? ¿O hay alguna biblioteca gráfica especial para este tipo de casos?
2) ¿Me conviene que los datos se almacenen en un archivo aparte, por ejemplo CSV o es mejor que estén guardados en una tabla de la base de datos general así tengo todos los datos en un solo lugar?