Foros del Web » Programando para Internet » Python »

Pasar una PyTable muy grande a un QTableWidget

Estas en el tema de Pasar una PyTable muy grande a un QTableWidget en el foro de Python en Foros del Web. Hola, Tengo una PyTable muy grande, mas de un millon de lineas, la idea es mostrarla en una GUI dentro de una QTableWidget. Me gustaria ...
  #1 (permalink)  
Antiguo 04/03/2014, 08:21
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 10 años, 5 meses
Puntos: 0
Pasar una PyTable muy grande a un QTableWidget

Hola,

Tengo una PyTable muy grande, mas de un millon de lineas, la idea es mostrarla en una GUI dentro de una QTableWidget.

Me gustaria saber como hacer esto de forma que no se muestre toda la tabla de golpe en la QTableWidget, porque es demasiado grande.

Me gustaria saber como hacer que se muestren solo unas lineas, 50 o 100, y segun se va haciendo scroll en la QTableWidget, se vayan mostrando las demas hasta el final.

El problema que estoy teniendo al intentar hacerlo de golpe es que se me bloquea la GUI, este es el codigo que estoy utilizando para hacerlo:

Código Python:
Ver original
  1. #Con la PyTable abierta y obtenido el nodo a la tabla
  2.  
  3. self.ui.tableWidget.setRowCount(tab.nrows)
  4. self.ui.tableWidget.setColumnCount(len(tab.colnames))
  5. self.ui.tableWidget.setHorizontalHeaderLabels(tab.colnames)
  6. res = []
  7.  
  8. #Intento leer y almacenar la PyTable
  9. for x in tab.where('col1 > -1'):
  10.     res.append(x[:])
  11.  
  12. #Intento escribirla en el QTableWidget
  13. for i, row in enumerate(res):
  14.     for j, col in enumerate(row):
  15.         item = QTableWidgetItem(str(col))
  16.         self.ui.tableWidget.setItem(i, j, item)  
  17.  
  18. #Haciendo esto con la PyTable de mas de un millon de lineas, no funciona

Me gustaria saber si alguien me puede indicar como hacerlo segun he dicho arriba, intentando que solo se muestre un trozo, y se vaya mostrando poco a poco al hacer scroll.

Gracias.
  #2 (permalink)  
Antiguo 04/03/2014, 10:13
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Pasar una PyTable muy grande a un QTableWidget

¿se te bloquea la GUI? ¿no será que lo haces en el mismo hilo de ejecución?
  #3 (permalink)  
Antiguo 05/03/2014, 00:38
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Cita:
Iniciado por AlvaroG Ver Mensaje
¿se te bloquea la GUI? ¿no será que lo haces en el mismo hilo de ejecución?

Si, lo hago en el mismo hilo, pero la cosa no va por los hilos o por hacer multithreading, la cosa pasa por NO MOSTRAR toda la tabla de golpe, solo lo que es visible en pantalla, y luego al hacer scroll ir mostrando mas poco a poco.
  #4 (permalink)  
Antiguo 05/03/2014, 08:51
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Debe haber un evento que sea llamado cuando el usuario hace un scroll en la tabla. Esto te puede servir.

  #5 (permalink)  
Antiguo 06/03/2014, 12:35
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Cita:
Iniciado por edanvar Ver Mensaje
Si, lo hago en el mismo hilo, pero la cosa no va por los hilos o por hacer multithreading, la cosa pasa por NO MOSTRAR toda la tabla de golpe, solo lo que es visible en pantalla, y luego al hacer scroll ir mostrando mas poco a poco.
Lo comentaba porque si lo haces en el mismo hilo, es claro que se te va a bloquear la GUI. Deberías hacerlo en un hilo separado, incluso si en situaciones normales el tiempo de bloqueo es corto.

La sugerencia de carbon debería funcionarte :)
  #6 (permalink)  
Antiguo 07/03/2014, 02:52
 
Fecha de Ingreso: octubre-2013
Mensajes: 59
Antigüedad: 10 años, 5 meses
Puntos: 0
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Lo he hecho, utilizando el evento generado al hacer scroll.

Todo funciona, pero no tan bien como yo quisiera....pongo el codigo y luego explico por que no va bien, a ver si alguien puede sugerir algo:

Código Python:
Ver original
  1. #La primera vez que muestro la tabla, solo
  2. #muestro unas pocas lineas de la PyTable,
  3. #las necesarias para llenar la pantalla
  4. for x in tab.iterrows(start=0, stop=35):
  5.     res.append(x[:])
  6.  
  7. for i, row in enumerate(res):
  8.      #aqui almaceno el indice de linea, para usarlo luego
  9.      self.indexi = i
  10.      for j, col in enumerate(row):
  11.         #Y aqui relleno la QTableWidget
  12.          item = QTableWidgetItem(str(col))
  13.          self.ui.tableWidget.setItem(i, j, item)

Previamente a todo esto ya habia hecho la conexion del evento de scroll asi:

Código Python:
Ver original
  1. QtCore.QObject.connect(self.ui.tableWidget.verticalScrollBar(), QtCore.SIGNAL('valueChanged(int)'), self.updateTable)

Y el slot que responde al evento, es mas o menos como lo anterior:

Código Python:
Ver original
  1. @QtCore.pyqtSlot(int)
  2. def updateTable(self, number):
  3.     res = []
  4.     for x in self.node.iterrows(start=self.indexi+1, stop=self.indexi+number):
  5.         res.append(x[:])
  6.     for i, row in enumerate(res):
  7.             self.indexi = self.indexi + 1
  8.             for j, col in enumerate(row):
  9.                 item = QTableWidgetItem(str(col))
  10.                 self.ui.tableWidget.setItem(self.indexi, j, item)  
  11.                 QApplication.instance().processEvents()

Ahora, EL PROBLEMA: todo esto funciona bien, el slot responde y todo eso, PERO, la PyTable es muy grande, mas de 1millon de lineas, y al hacer scroll en la QTableWidget, como ya habia definido previamente sus atributos, lo que sucede es que al hacer scroll en la QTableWidget, el scroll es un avance de mas de 5000 lineas, con lo cual al intentar actualizar la QTableWidget con 5000 o mas lineas de golpe, no responde instantaneo, le cuesta varios segundos.

Código Python:
Ver original
  1. self.ui.tableWidget.setRowCount(tab.nrows)
  2. self.ui.tableWidget.setColumnCount(len(tab.colnames))

P.D: tampoco responde bien si haces varios scrolls seguidos, rapidos en la QTableWidget

Última edición por edanvar; 07/03/2014 a las 07:32
  #7 (permalink)  
Antiguo 07/03/2014, 12:53
 
Fecha de Ingreso: enero-2012
Ubicación: Buenos Aires
Mensajes: 745
Antigüedad: 12 años, 3 meses
Puntos: 35
Respuesta: Pasar una PyTable muy grande a un QTableWidget

Y que tal si, como te comentaron, lo haces en otro hilo?
  #8 (permalink)  
Antiguo 08/03/2014, 19:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Pasar una PyTable muy grande a un QTableWidget

¿Y si haces paginado?

http://sateeshkumarb.wordpress.com/2...-data-in-pyqt/

Etiquetas: scroll
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 16:44.