2009-02-06 9 views
8

Estoy prototipando una aplicación Python con el módulo cmd.paginación con el módulo python cmd

Algunos mensajes para el usuario serán bastante largos y me gustaría paginarlos. Aparecerán las primeras 10 (o un número configurable) de líneas del mensaje, y al presionar la barra espaciadora se mostrará la página siguiente, hasta el final del mensaje.

No quiero reinventar algo aquí, ¿hay una manera simple de implementar esta característica?

Respuesta

4

Lo simple sería simplemente canalizar su script a través de "menos" o un comando similar en tiempo de ejecución.

Aquí es un método sencillo que aproximadamente lo que quiere, sin embargo:

def print_and_wait(some_long_message): 
    lines = some_long_message.split('\n') 
    i=0 
    while i < len(lines): 
     print '\n'.join(lines[i:i+10]) 
     raw_input("press enter to read more...") 
     i += 10 

También se puede ver en el uso maldiciones.

+0

Gracias, pero la canalización a través de menos evitaría la interacción, que es el objetivo del módulo cmd. La implementación de una solución de curses va más allá del primer borrador que quiero construir con el módulo cmd. Sin embargo, su solución print_and_wait es un buen comienzo (aunque no funcionó). – Gra

3

Como dijo Yoni anteriormente, la forma correcta de hacer esto es proporcionar un método de impresión que páginas automáticamente dentro de la instancia de cmd que se está ejecutando. El constructor de Cmd toma argumentos stdin y stdout. Tan simple, proporcione un objeto que funcione como stdout y admita su método de impresión de paginación.

class PagingStdOut(object): 
    def write(self, buffer, lines_before_pause=40): 
     # do magic paging here... 
0

subrutinas de paginación se pueden encontrar en el archivo de genutils.pyIPython (ver page o page_dumb por uno más sencillo). El código es un poco complicado, pero eso es probablemente inevitable si está tratando de ser portátil para sistemas que incluyen Windows y los diversos tipos de emuladores de terminal.

+0

Gracias, ya implementé mis rutinas de búsqueda. Echaré un vistazo para ver qué perdí en los archivos que señalas. Actualmente funciona en mi sistema operativo, pero no probé nada más, por lo que las mejoras portátiles podrían ser útiles. – Gra

1

Tenía la misma pregunta. Hay un buscapersonas integrado en el pydoc module. Lo incorporé de esta manera (que me parece hackoso e insatisfactorio ... aunque estoy abierto a mejores ideas).

Me gusta la idea de que sería una página automática si hay más de x resultados y la paginación está activada, lo que es posible implementar, pero no se hace aquí.

import cmd 
from pydoc import pager 
from cStringIO import StringIO 
import sys 

PAGER = True 
class Commander(cmd.Cmd): 
    prompt = "> " 
    def do_pager(self,line): 
     global PAGER 
     line = line + " 1" 
     tokens = line.lower().split() 
     if tokens[0] in ("on","true","t", "1"): 
      PAGER = True 
      print "# setting PAGER True" 
     elif tokens[0] in ("off","false","f","0"): 
      PAGER = False 
      print "# setting PAGER False" 
     else: 
      print "# can't set pager: don't know -> %s" % tokens[0] 

    def do_demo(self,line): 
     results = dict(a=1,b=2,c=3) 
     self.format_commandline_results(results) 

    def format_commandline_results(self,results): 
     if PAGER: 
      ofh = StringIO() 
     else: 
      ofh = sys.stdout 

     for (k,v) in sorted(results.items()): 
      print >> ofh, "%s -> %s" % (k,v) 

     if PAGER: 
      ofh.seek(0) 
      pager(ofh.read()) 

     return None 

    def do_EOF(self,line): 
     print "", 
     return True 

if __name__ == "__main__": 
    Commander().cmdloop("# try: \n> pager off \n> demo \n> pager on \n> demo \n\n")