domingo, 14 de noviembre de 2010

Algo mas de "curses" en python.

Esto es algo mas complicado, un menú. El código está algo "sucio", pero espero que se entienda:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import curses, sys, traceback, os
#Variables globales
class globales:
    scrn = None  #la pantalla principal
    menu = None  #la 'caja' de los menus
    tecla = None
#clases
#funciones
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.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, "O", curses.A_UNDERLINE)
    globales.files.addstr(1, 2, "pen")
    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()
            break
        if globales.tecla == 'o':
            globales.scrn.addstr(10, 1, "Python curses in action!")
          
          
    pass
  
def main(stdscr):
    inicializa(stdscr)
    menus()
    return 0
#principal
if __name__ == '__main__':
    curses.wrapper(main)
Ahora comprendo cómo funciona el "curses.wrapper()". Cuando se llama a la función 'main' lo hace con la pantalla principal "stdscr = curses.initscr()" ya inicializada.

No hay comentarios:

Publicar un comentario