Foros del Web » Programando para Internet » Python »

Introducir texto aceptando sugerencias de autocompletar

Estas en el tema de Introducir texto aceptando sugerencias de autocompletar en el foro de Python en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 30/01/2013, 14:59
 
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?
  #2 (permalink)  
Antiguo 31/01/2013, 09:42
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Introducir texto aceptando sugerencias de autocompletar

1) No creo que haya una biblioteca específica para esto, y lo podés representar en pantalla de diferentes formas. Pienso que un desplegable para cada opción seleccionable es la mejor forma de representarlo.

2) Si no vas a tener muchos datos, leer un csv y dejarlo en memoria mientras lo necesitas no será un gran problema. No creo que valga mucho la pena tener una base de datos (aún si es una liviana como sqlite) por algunas decenas de registros.
  #3 (permalink)  
Antiguo 31/01/2013, 10:31
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Introducir texto aceptando sugerencias de autocompletar

Cita:
Iniciado por AlvaroG Ver Mensaje
1) No creo que haya una biblioteca específica para esto, y lo podés representar en pantalla de diferentes formas. Pienso que un desplegable para cada opción seleccionable es la mejor forma de representarlo.

2) Si no vas a tener muchos datos, leer un csv y dejarlo en memoria mientras lo necesitas no será un gran problema. No creo que valga mucho la pena tener una base de datos (aún si es una liviana como sqlite) por algunas decenas de registros.
Muchas gracias Alvaro!

Cuando tenga algo armado lo presento acá mismo para ver opiniones!

Con respecto al punto 2 me refería porque tal vez, no lo tengo claro todavía, precisaría agregar otro módulo al programa para que el usuario pueda gestionar las entradas de autocompletar. Por ejemplo por error digitan Braasil y que puedan eliminarlo de la lista.

No se si en ese caso no me queda más práctico manejarlo como tabla de una base de datos o como un TXT o CSV puro, lo iré viendo.
  #4 (permalink)  
Antiguo 31/01/2013, 11:47
 
Fecha de Ingreso: noviembre-2012
Mensajes: 111
Antigüedad: 12 años
Puntos: 6
Respuesta: Introducir texto aceptando sugerencias de autocompletar

Otra forma que se me ocurre es guardar la lista de autocompletar usando Pickle.

Supongo que como está pensado justamente para guardar casos como listas, tuplas, etc... será más ágil.

Curioso que Dive into Python no incluya esa lección. Tampoco la incluye otro libro que tengo "Python Programming - An Introduction to Computer Science (Second Edition) by John M. Zelle"



Finalmente lo encontré en "Python Programming for the Absolute Beginner by Michael Dawson (Third Edition)"

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:12.