Mi problema es el siguiente.: Al intentar agregar una enorme cantidad de
items a un
ListCtrl, este dura mucho tiempo. Tal vez me dirán que es lógico, pues el bucle for tendrá igual numero de iteraciones que los items en la lista y por consiguiente el tiempo sera proporcionalmente.... eso lo había comprendido y aceptado resignandome a ese problema, hasta que, no recientemente, instale
MySQL Quety Browser para hacer las consultas a
MySQL desde una interfaz gráfica. Este programa muestra las tablas en un
ListCtrl de igual manera que la muestra mi programa, a excepción de que el tiempo es increíblemente menor, aproximadamente menos de
2 segundos en hacer la consulta y agregar los items a su lista, sin embargo mi código dura mas de
40 segundos en hacer lo mismo.
"La tabla consta de 20,000 items|filas"
Intente usando
Thread, pero en realidad no me interesan ya. ya que aunque este trabajando en segundo plano, el tiempo es el mismo.
He probado usando el método
Append, para agregar los items al ListCtrl, pero es lo mismo.
Le quite el código para asignarle
imágenes, pero igual.
No creo que el problema sea por que python es de alto nivel, por que creo que aun MySQL Browser este escrito en C, la diferencia de 2 a 40seg es mucha (pienso).
La lista de articulos obtenida de la base de datos, es algo parecido a esto:
((ref, clase, marca, atributos, cant, precio, costo, fecha), (ref, clase, marca,....)....(n))
el codigo de la funcion es este:
Código Python:
Ver originaldef AddListaInventario(self, articulos):
"""Agregar los articulos a la lista de inventario"""
#eliminar los items anteriores
self.list_ctrl_inventario.DeleteAllItems()
#asignar las imagenes
imagenes = [self.GetGrafico("articulo_20"),
self.GetGrafico("articulo2_20")]
li = wx.ImageList(20,20, True)
for bmp in imagenes:
num_icn = li.Add(bmp)
self.list_ctrl_inventario.AssignImageList(li,wx.IMAGE_LIST_SMALL)
#agregar los items
for fila in articulos:
if fila[4] == 0:
img = 1 % (num_icn+1)
else:
img = 0 % (num_icn+1)
index = self.list_ctrl_inventario.InsertStringItem(sys.maxint,
fila[0], img)
self.list_ctrl_inventario.SetStringItem(index, 1, fila[1])
self.list_ctrl_inventario.SetStringItem(index, 2, fila[2])
self.list_ctrl_inventario.SetStringItem(index, 3, fila[3])
self.list_ctrl_inventario.SetStringItem(index, 4, str(fila[4]))
self.list_ctrl_inventario.SetStringItem(index, 5,
str(locale.currency(fila[5], grouping=True)))
self.list_ctrl_inventario.SetStringItem(index, 6,
str(locale.currency(fila[6], grouping=True)))
self.list_ctrl_inventario.SetStringItem(index, 7, fila[7])