domingo, 29 de abril de 2012

Efectos de consola, parte 1

Cuando aprendemos a programar en Python, nuestros programas interactúan con el usuario a través de algo llamado la "consola".  La consola es una ventana donde sólo se visualiza información de texto- nada de gráficos, menús desplegables, gadgets ni nada de esas cosas a las cuales nos han (mal?) acostumbrado aplicaciones que usan GUIs (Graphical User Interface).  Siendo Python un lenguaje de alto nivel utilizado para desarrollar aplicaciones rápidamente en sistemas operativos modernos, es evidente que existe en este lenguaje formas de incluir GUIs en nuestras aplicaciones.  Por ejemplo, podríamos usar las librerías de Tcl/Tk para crear estas interfaces gráficas.  Sin embargo, hay que aprender un poco más de Python y de programación para poderlas usar y se supone que nosotros somos principiantes...

En esta serie de posts, vamos a comentar un poco sobre como lograr ciertos "efectos" con la consola.  Vamos a empezar con los más básicos.

Cuando dentro de un literal de cadena incluimos un caracter de barra diagonal invertida ("\"), estamos indicandole al interprete de Python que queremos imprimir un caracter especial.  La barra diagonal invertida se conoce como caracter de escape y la secuencia completa de la barra diagonal más otro caracter se conoce como secuencia de escape.  Algunas secuencias de escape son:

\n  Salto de línea.  Ejemplo:

               print "Esto se coloca en una línea.\nY esto va en la siguiente línea"

        Imprime lo siguiente:

      Esto se coloca en una línea.
      Y esto va en la línea siguiente

\r   Es el retorno de carro, con lo cual se ubica el cursor al principio de la línea actual. Ejemplo:

      print "Esto se coloca en una línea.\rVolvemos al principio."

        Imprime lo siguiente:

      Volvemos al principio.línea.


\b Es el backspace, que retrocede el cursor una posición a la izquierda.  Ejemplo:

      print "José\b\b\b\bLuis aprende Python."

      Imprime lo siguiente:

      Luis aprende Python.


\"   Imprime comillas.  Recuerde que para definir cadenas en Python las encerramos entre comillas, pero si queremos imprimir una comilla, necesitamos indicarla de alguna forma que Python no "piense" que estamos delimitando el principio o el fín de una cadena.  Ejemplo:

      print "Cuando corri mi primer programa de Python, la salida leía \"Hola Mundo\""

       Imprime lo siguiente:


       Cuando corri mi primer programa de Python, la salida leía "Hola Mundo"

\a   Emite un "beep" sonoro.  Ejemplo:

            print "¡Despierta!\a"


        Imprime "¡Despierta!" y luego suena un beep.

\t   Tabulador horizonal.  Ejemplo

        print"Esto es una tabla:\nJosé\t1\nMiguel\t2\nPedro\t3\n"

        Imprime lo siguiente:

        Esto es una tabla:
        José    1
        Miguel  2
        Pedro   3


\v  Tabulador vertical.  Ejemplo

        print "Tabulador vertical\vSiguiente línea..."

        Imprime lo siguiente (observe que salta a la siguiente línea pero mantiene la posición horizontal del cursor):

        Tabulador vertical
                          Siguiente línea...



\f  Form feed.  En las impresoras, esto hacia que se alimentara la siguiente hoja de papel.  En la consola, el efecto es aparentemente igual al del tabulador vertical.  Ejemplo:

        print "pagina 1\fpagina 2\fpagina 3"


        Imprime:

        pagina 1
                pagina 2
                        pagina 3


\xhh   Imprime el carácter cuyo código ASCII es hh.  Ejemplo:

        print "Una a mayuscula: \x41"

        Imprime:

        Una a mayuscula: A


Es interesante notar que todos los caracteres especiales que se mencionan en todas estas secuencias de escape (salvo la última) representan carácteres con códigos ASCII definidos.  Así por ejemplo, la secuencia "\t" representa un solo caracter cuyo código ASCII es 9 (en decimal).  Veamos los códigos ASCII correspondientes a algunas de estas secuencias de escape:

    print "Salto de línea\t\t"+str(ord("\n"))+"\nRetorno de carro\t"+str(ord("\r"))

Con lo cual se imprime:

    Salto de línea      10
    Retorno de carro    13


La función ord() devuelve el código ASCII correspondiente al caracter suministrado en su argumento.  La función str() convierte el número entero que devuelve ord() a una cadena, para que se pueda concatenar todo como una sola cadena.  Otra función relacionada es chr(), la cual devuelve el caracter asociado al código ASCII que se suministra como su argumento.  Si queremos imprimir carácteres que no aparecen en nuestro teclado, buscamos su código ascii y lo indicamos mediante la función chr() o mediante la secuencia de escape "\xhh" donde hh es el código ASCII del carácter en cuestión, pero en hexadecimal.