Foros del Web » Programando para Internet » Python »

Como realizar busquedas en todas las columnas de un wxListCtrl?

Estas en el tema de Como realizar busquedas en todas las columnas de un wxListCtrl? en el foro de Python en Foros del Web. Me preguntaba si habrá algún método para obtener el valor de la fila completa de un wxListCtrl. Por motivos de rendimiento, intento reducir el numero ...
  #1 (permalink)  
Antiguo 08/11/2011, 19:52
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 13 años, 3 meses
Puntos: 2
Pregunta Como realizar busquedas en todas las columnas de un wxListCtrl?

Me preguntaba si habrá algún método para obtener el valor de la fila completa de un wxListCtrl.
Por motivos de rendimiento, intento reducir el numero de consultas a la base de datos, haciendo la busqueda directamente en el wxListCtrl. Tenia planeado escribir una funcion para tal fin, pero antes quise venir aquí en busca de información de algún metodo mas formal.

Uso el método FindItem, pero este busca solo en la primera columna (en su indice).
  #2 (permalink)  
Antiguo 08/11/2011, 22:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Como realizar busquedas en todas las columnas de un wxListCtrl?

Me temo que lo tendrás que implementar por ti mismo.

Código Python:
Ver original
  1. #coding: cp1252
  2.  
  3. import wx
  4.  
  5. class MyFrame(wx.Frame):
  6.  
  7.     def __init__(self, *args, **kwargs):
  8.         wx.Frame.__init__(self, *args, **kwargs)
  9.  
  10.         panel = MyPanel(self, -1)
  11.  
  12. class MyPanel(wx.Panel):
  13.    
  14.     def __init__(self, *args, **kwargs):
  15.         wx.Panel.__init__(self, *args, **kwargs)
  16.         self.vbox = wx.BoxSizer(wx.VERTICAL)
  17.  
  18.         self.text_ctrl = wx.TextCtrl(self)
  19.         self.list_ctrl = wx.ListCtrl(self, style=wx.LC_REPORT|wx.BORDER_SUNKEN)
  20.         self.btn = wx.Button(self, label="Search")
  21.        
  22.         self.vbox.Add(self.text_ctrl, 0, wx.ALL|wx.EXPAND, 5)
  23.         self.vbox.Add(self.list_ctrl, 1, wx.ALL|wx.EXPAND, 5)
  24.         self.vbox.Add(self.btn, 0, wx.ALL|wx.CENTER, 5)
  25.        
  26.         self.list_ctrl.InsertColumn(0, 'ID')
  27.         self.list_ctrl.InsertColumn(1, 'Name')
  28.         self.list_ctrl.InsertColumn(2, 'LastName')
  29.        
  30.         self.items = [(0, 'Juan', 'Perez'),
  31.                       (1, 'Jose', 'Hernandes'),
  32.                       (2, 'Pedro', 'Gonzales')]
  33.        
  34.         for i, name, lastname in self.items:
  35.             self.list_ctrl.InsertStringItem(i, str(i))
  36.             self.list_ctrl.SetStringItem(i, 1, name)
  37.             self.list_ctrl.SetStringItem(i, 2, lastname)
  38.  
  39.         self.SetSizer(self.vbox)
  40.        
  41.         self.btn.Bind(wx.EVT_BUTTON, self.onSearch)
  42.        
  43.     def getColumns(self, row, columns):
  44.         return [self.list_ctrl.GetItem(row, j).GetText() for j in xrange(columns)]
  45.    
  46.     def onSearch(self, event):
  47.         key = self.text_ctrl.GetValue()
  48.         rows = self.list_ctrl.GetItemCount()
  49.         columns = self.list_ctrl.GetColumnCount()
  50.         results = []
  51.         for i in xrange(rows):
  52.             cols = self.getColumns(i, columns)
  53.             if key in cols:
  54.                 results.append(cols)
  55.         print results
  56.        
  57.  
  58.  
  59. if __name__ == "__main__":
  60.     app = wx.App(0)
  61.     frame = MyFrame(None, -1)
  62.     frame.Show()
  63.     app.MainLoop()
Aquí te dejo un ejemplo.

Pero si la búsqueda la puede hacer la base de datos entonces que la haga la base de datos.

Ahora si son muchos resultados solo muestra los primeros 200 o 20.
  #3 (permalink)  
Antiguo 09/11/2011, 06:39
Avatar de wilmermorel  
Fecha de Ingreso: agosto-2011
Ubicación: Santo Domingo
Mensajes: 30
Antigüedad: 13 años, 3 meses
Puntos: 2
De acuerdo Respuesta: Como realizar busquedas en todas las columnas de un wxListCtrl?

El problema de mostrar muchos resultados en el ListCtrl ya lo solucioné con la [URL="http://www.forosdelweb.com/f130/problema-agregando-enormes-cantidad-items-listctrl-wxpython-956199/"]ayuda[/URL] que me diste anteriormente creando un lista virtual que me funciona perfectamente.

Ahora bien, sobre hacer que la base de datos haga la búsqueda ella, no se si seria lo correcto, solo he probado haciendo consultas desde mi localhost, y pensé que varios equipos conectados al servidor, haciendo consultas desde distintas IP, infringirían en la velocidad, y otra cosa es que la búsqueda se hace instantáneamente al introducir los caracteres en el TextCTrl. Por eso preferí realizar consultas a la base de datos solo cuando se necesiten actualizar los items. Es una suposición mía, con el propósito de evitar inconvenientes en el futuro.

Pero la validez de esta suposición no la tengo yo, por falta de conocimientos.
Qué seria lo correcto?
  #4 (permalink)  
Antiguo 09/11/2011, 09:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Como realizar busquedas en todas las columnas de un wxListCtrl?

Claro que puedes hacer eso, pero si vas hacer una búsqueda te recomiendo mostrar solo los primeros n elementos (donde n es pequeño), y hacerlo en base de datos.

Incluso google que hace búsquedas y encuentra millones de resultados no te muestra todos los resultados solo te muestra los primeros 20 o depende de como lo configures.

Es una regla simple si lo puede hacer la base de datos entonces que lo haga la base de datos. Por que es mas rápido y eficaz.

Etiquetas: busquedas, finditem, listctrl, metodos, wxlistctrl, wxpython
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 14:35.