2010-02-17 14 views
6

Tengo dos archivos grandes de tamaño idéntico. Uno es texto plano ASCII, y el otro es una superposición codificada por colores, un byte por carácter de texto en el archivo correspondiente.que muestra una gran cantidad de texto formateado en Python

Estos archivos pueden ser grandes: hasta 2.5 MB; posiblemente mucho más, tal vez más de 100 MB más tarde.

Quiero mostrar el texto es un visor de texto desplazable, utilizando el segundo archivo como superposición. Buscando algo como esto:

Tkinter Text window with tagged text for colours http://img713.imageshack.us/img713/2584/statsviewer01d.png

Hice, pues, un simple widget de la ventana tkinter texto en Python con la barra de desplazamiento y tal.

Mi código es el siguiente:

hottest = 0 
for heat in heatmap: 
    hottest = max(hottest,ord(heat)) 
hottest += 1 
for heat in xrange(0,hottest): 
    factor = int((float(heat)/float(hottest))*100.0) 
    # an observation; tkinter seems to normalise custom colours 
    # to nearest in it's palette, which means I can't use custom 
    # gradients of red; if anyone knows how to use subtle custom colours? 
    bgcolour = "gray%d" % (100-factor) 
    fgcolour = "gray%d" % factor 
    text.tag_config("n%d"%heat,background=bgcolour,foreground=fgcolour) 
text.insert("1.0",f.read()) 
ofs = 0 
for heat in heatmap: 
    if 0 != ord(heat): 
     coord_start = "1.0 + %d chars"%ofs 
     coord_stop = "1.0 + %d chars"%(ofs+1) 
     text.tag_add("n%d"%ord(heat),coord_start,coord_stop) 
    ofs += 1 
text.config(state=DISABLED) 
text.focus() 

Sin embargo, me encuentro con problemas de rendimiento horribles:

  1. que cargan el texto

    • si simplemente uso textwidget.text = textfile.read() se carga instantáneamente, incluso para el archivo grande; pero luego el problema es codificarlo con colores. (ver el código anterior). Para agregar las etiquetas, un carácter a la vez, parece forzarlo a tomar un painter algorithm; en el momento en que el archivo tiene un tamaño de aproximadamente 300 KB, me doy por vencido esperando a que cargue
    • si leo el siguiente carácter del archivo de texto y el archivo de color y añado un carácter correctamente etiquetado, lleva una eternidad; un archivo de más de 200 KB y renuncio a la espera de que cargue
  2. Desplazamiento. Si esta cantidad de formateo visible en la ventana actual, se va muy lentamente

si me acercaba a este problema, digamos, en Dephi o wxWidgets o lo que sea, tendría un control personalizado de tracción animal.

¿Cuál es la forma más directa en Python y Tkinter?

+1

considere dejar de usar Tkinter. No sé si lo que preguntas es posible, pero Tkinter tiene muchas limitaciones y generalmente es demasiado complejo para trabajar. – nosklo

+0

@nosklo: si tiene una alternativa sugerida, publíquela como respuesta para que podamos votarla. –

+0

@nosklo: ¿cuáles son las alternativas? Portátil, gratis, bien documentado, fácil, ...? – Will

Respuesta

3

¿Qué le parece usar un lienzo desplazable en su lugar, y solo dibujar el texto/mapa de calor que expone el usuario? Eso debería darte un primer sorteo rápido y un redibujado rápido cuando las cosas se muevan, sin importar el tamaño del archivo.

Si desea más velocidad y más control, entonces necesitaría algún tipo de lienzo virtual donde solo exista realmente el área en exhibición y un área alrededor de ella, cualquier otra cosa solo se dibujará cuando se haga referencia a ella. No creo que TkInter te dé tanto control, aunque cosas como el Widget Construction Kit (WCK) deberían hacer.

+0

[Visualización de grandes cantidades de datos] (http://effbot.org/zone/wck-4.htm) – wwii

Cuestiones relacionadas