Ver Mensaje Individual
  #1 (permalink)  
Antiguo 30/01/2013, 14:59
tecafede
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Introducir texto aceptando sugerencias de autocompletar

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 original
  1. import wx
  2.  
  3. class PromptingComboBox(wx.ComboBox) :
  4.     def __init__(self, parent, value, choices=[], style=0, **par):
  5.         wx.ComboBox.__init__(self, parent, wx.ID_ANY, value, style=style|wx.CB_DROPDOWN, choices=choices, **par)
  6.         self.choices = choices
  7.         self.Bind(wx.EVT_TEXT, self.EvtText)
  8.         self.Bind(wx.EVT_CHAR, self.EvtChar)
  9.         self.Bind(wx.EVT_COMBOBOX, self.EvtCombobox)
  10.         self.ignoreEvtText = False
  11.  
  12.     def EvtCombobox(self, event):
  13.         self.ignoreEvtText = True
  14.         event.Skip()
  15.  
  16.     def EvtChar(self, event):
  17.         if event.GetKeyCode() == 8:
  18.             self.ignoreEvtText = True
  19.         event.Skip()
  20.  
  21.     def EvtText(self, event):
  22.         if self.ignoreEvtText:
  23.             self.ignoreEvtText = False
  24.             return
  25.         currentText = event.GetString()
  26.         found = False
  27.         for choice in self.choices :
  28.             if choice.startswith(currentText):
  29.                 self.ignoreEvtText = True
  30.                 self.SetValue(choice)
  31.                 self.SetInsertionPoint(len(currentText))
  32.                 self.SetMark(len(currentText), len(choice))
  33.                 found = True
  34.                 break
  35.         if not found:
  36.             event.Skip()
  37.  
  38. class TrialPanel(wx.Panel):
  39.     def __init__(self, parent):
  40.         wx.Panel.__init__(self, parent, wx.ID_ANY)
  41.  
  42.         choices = ['grandmother', 'grandfather', 'cousin', 'aunt', 'uncle', 'grandson', 'granddaughter']
  43.         for relative in ['mother', 'father', 'sister', 'brother', 'daughter', 'son']:
  44.             choices.extend(self.derivedRelatives(relative))
  45.  
  46.         cb = PromptingComboBox(self, "default value", choices, style=wx.CB_SORT)
  47.  
  48.     def derivedRelatives(self, relative):
  49.         return [relative, 'step' + relative, relative + '-in-law']
  50.  
  51.  
  52. if __name__ == '__main__':
  53.     app = wx.App()
  54.     frame = wx.Frame (None, -1, 'Demo PromptingComboBox Control', size=(400, 50))
  55.     TrialPanel(frame)
  56.     frame.Show()
  57.     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?