miércoles, 17 de noviembre de 2010

El programa de "curses" (II)

Ahora con 'subprocess' para que realice una tarea útil (en este caso listar los archivos del directorio actual):
import curses, sys, traceback, os, subprocess
#Variables globales
class globales:
    scrn = None  #la pantalla principal
    menu = None  #la 'caja' de los menus
    tecla = None
    vent = None
#clases
#funciones

def get_popen(command):
     sp = subprocess
     return subprocess.Popen(command, stdout=sp.PIPE, stderr=sp.STDOUT)
def readlines(fd):
     while 1:
         line = fd.readline()
         if not line:
             break
         yield line

def inicializa(stdscr):
    globales.scrn = stdscr # curses.initscr() el "wrapper" ya lo inicializa
    curses.noecho()  #para que no se vean en pantalla las teclas que golpeamos
    curses.cbreak()  #para no tener que dar a retorno cada vez que se pulsa una tecla
    curses.curs_set(0)  #para ocultar el cursor
    curses.start_color()  #para poner colores (aunque no he usado esto)
    globales.scrn.clear()  #se limpia la pantalla principal
    globales.scrn.keypad(1)  #para poder leer las teclas de funcion, etc.
    globales.scrn.border()  #ponemos un borde a la pantalla principal
    globales.scrn.refresh()  #y pintamos...

def menus():
    globales.menu = curses.newwin(3, 78, 1, 1)  #creamos la 'caja' de los menús
    globales.vent = curses.newwin(19,78,4,1) #creamos la 'caja' de salidas
    globales.menu.clear()  #limpiamos la caja
    globales.menu.border() #le ponemos un borde
    globales.menu.addstr(1, 1, "F", curses.A_UNDERLINE)
    globales.menu.addstr(1, 2, "ile")
    globales.menu.addstr(1, 6, "Q", curses.A_UNDERLINE)
    globales.menu.addstr(1, 7, "uit")
    globales.menu.refresh() #y pintamos...
    while True:
        globales.tecla = globales.scrn.getch()
        globales.tecla = chr(globales.tecla)
        if globales.tecla == 'q':break
        if globales.tecla == 'f':
            fichero()

def fichero():
    globales.files = curses.newwin(4, 10, 3, 1)
    globales.files.clear()
    globales.files.border()
    globales.files.addstr(1, 1, "L", curses.A_UNDERLINE)
    globales.files.addstr(1, 2, "ist")
    globales.files.addstr(2, 1, "E", curses.A_UNDERLINE)
    globales.files.addstr(2, 2, "xit")
    globales.files.refresh()
    while True:
        globales.tecla = globales.scrn.getch()
        globales.tecla = chr(globales.tecla)
        if globales.tecla == 'e':
            globales.files.clear()  #limpiamos el menú de ficheros
            globales.files.refresh()
            globales.scrn.redrawwin() #reescribimos la pantalla principal
            globales.scrn.refresh()
            globales.menu.redrawwin() #reescribimos la caja de menús
            globales.menu.refresh()
            globales.vent.redrawwin()
            globales.vent.refresh()
            break
        if globales.tecla == 'l':
            command = "ls -lh"
            popen = get_popen(command.split())
            #vent = curses.newpad(20,78)
           
            globales.vent.border()
            globales.vent.addstr(1, 1, "Python curses in action!")
            i=1
            for line in readlines(popen.stdout):
                i += 1
                globales.vent.addstr(i, 1, line)
            globales.vent.refresh()
            globales.files.redrawwin()
            globales.files.refresh()
           
         
         
    pass
 
def main(stdscr):
    inicializa(stdscr)
    menus()
    return 0
#principal
if __name__ == '__main__':
    curses.wrapper(main)

No hay comentarios:

Publicar un comentario