[pyar] Implementando una barra de progreso

Luis esteban en princesa.pri.sld.cu
Lun Oct 28 13:37:00 ART 2013


Hola,

Estoy desarrollando un módulo(gui.py) que permita implementar algunos de  
los objetos que comúnmente empleamos en nuestras GUIs en modo texto a  
partir de la librería curses. Mi objetivo primordial es poder codificar  
aplicaciones en modo texto con facilidad con la ayuda de este módulo y  
dotarlas de mucha flexibilidad al navegar por las ventanas.

Por ejemplo, he implementado una barra de progreso, pero mi gran duda es  
como sincronizar el progreso de la misma con un proceso determinado,  
digamos la copia de un archivo de gran tamaño o la copia de muchos  
archivos.

Hasta el momento avanza cada un segundo y en función de un entero que le  
paso a la función, el cual establece la longitud de la barra en  
caracteres. Esto lo hice así para lograr implementarla, pero ahora debo  
sincronizarla con un proceso determinado. Me imagino que tengo que meterme  
en el mundo del manejo de los procesos. Estoy en lo cierto?

Una vez logrado este objetivo introduciré esta función(progressbar) en el  
módulo gui.py

Las funciones: activar_eco(), desactivar_cursor(), mostrar_texto() y  
fin_modo_mostrar_texto(), entre otras, son funciones que tengo dentro del  
módulo pero las incluí acá para los que deseen probar.

Soy todo oido para escuchar sugerencias  :)

--------------------------------------
#-*- coding: UTF-8 -*-
#!/usr/bin/env python

import curses
import time
# from gui import *

#----DESDE AQUI: tomado del módulo gui.py----
# matriz para los pares de colores.
# La función init_pair(n, f, b): establece pares de colores.
# n: par color n, f: color primer plano, b: color segundo plano.
# MUY IMPORTANTE:
# El par 0(f: white, b: black) del sistema no puede ser cambiado.
# Nótece, por tanto, que aquí par_color[0] <f: white y b: black> no es
# el par 0 del sistema sino un par definido por mí.
#            par color primer plano  color segundo plano
par_color = [[1, curses.COLOR_WHITE  , curses.COLOR_BLACK],   # par color 0
              [2, curses.COLOR_BLUE   , curses.COLOR_BLACK],   # par color 1
              [3, curses.COLOR_CYAN   , curses.COLOR_BLACK],   # par color 2
              [4, curses.COLOR_GREEN  , curses.COLOR_BLACK],   # par color 3
              [5, curses.COLOR_MAGENTA, curses.COLOR_BLACK],   # par color 4
              [6, curses.COLOR_RED    , curses.COLOR_BLACK],   # par color 5
              [7, curses.COLOR_YELLOW , curses.COLOR_BLACK],   # par color 6
              [8, curses.COLOR_BLACK  , curses.COLOR_BLUE],    # par color 7
              [9, curses.COLOR_GREEN  , curses.COLOR_BLUE],    # par color 8
              [10, curses.COLOR_RED   , curses.COLOR_BLUE],    # par color 9
              [11, curses.COLOR_WHITE , curses.COLOR_BLUE],    # par color  
10
              [12, curses.COLOR_YELLOW, curses.COLOR_BLUE],    # par color  
11
              [13, curses.COLOR_YELLOW, curses.COLOR_CYAN],    # par color  
12
              [14, curses.COLOR_BLACK , curses.COLOR_CYAN],    # par color  
13
              [15, curses.COLOR_WHITE , curses.COLOR_CYAN],    # par color  
14
              [16, curses.COLOR_BLACK , curses.COLOR_MAGENTA]] # par color  
15

# iniciamos el modo texto.
stdscr = curses.initscr()

# limpiamos la pantalla.
stdscr.clear()

# conseguimos el número máximo de filas y columnas de nuestra pantalla.
ymax_xmax = stdscr.getmaxyx()
xmax = ymax_xmax[1] # número máximo de columnas
ymax = ymax_xmax[0] # número máximo de filas

# arrancamos el modo color.
curses.start_color()

curses.cbreak()

# función para activar el eco.
def activar_eco():
     curses.echo()

# función para desactivar el cursor.
def desactivar_cursor():
     curses.curs_set(0)

# función para mostrar una línea de texto en pantalla.
def mostrar_texto(x, y, texto, par_color, n):
     curses.init_pair(par_color[n][0], par_color[n][1], par_color[n][2])
     stdscr.addstr(y, x, texto, curses.color_pair(par_color[n][0]))
     stdscr.refresh()

# función para terminar el modo texto.
def fin_modo_mostrar_texto():
     curses.endwin()
#----HASTA AQUI: tomado del módulo gui.py----

# función que implementa una barra de progreso.
def progressbar(x, y, proceso, longitud):
     # 'x' e 'y' son las coordenadas de la barra.
     # 'proceso' es el progreso que transcurre.
     # 'longitud' es la longitud de la barra.

     activar_eco()
     desactivar_cursor()

     # fondo de la barra e indicador de %.
     fondo = ' '*longitud
     mostrar_texto(x - longitud/2, y, fondo, par_color, 7)
     porciento = '0%'
     mostrar_texto(x-1, y, porciento, par_color, 10)

     # manejo del proceso.
     antes = time.localtime()
     # posición(minutos transcurridos) en la barra.
     i = 1
     texto = ' '
     retardo = True
     while retardo:
         # cálculo del porciento
         porciento = i*100/longitud
         porciento = str(porciento)+'%'

         if i < longitud/2:
             mostrar_texto(x-len(porciento)/2, y, porciento, par_color, 10)
         elif i == longitud/2:
             # 1er caracter de porciento de un color y los otros dos de  
otro color
             mostrar_texto(x-len(porciento)/2, y, porciento[0:1],  
par_color, 13)
             mostrar_texto(x-len(porciento)/2+1, y, porciento[1:],  
par_color, 10)
         elif i == longitud/2+1:
             # los dos primeros caracteres de porciento de un color y el  
otro de otro color
             mostrar_texto(x-len(porciento)/2, y, porciento[0:2],  
par_color, 13)
             mostrar_texto(x-len(porciento)/2+2, y, porciento[2:],  
par_color, 10)
         elif i == longitud/2+2:
             # los tres caracteres de porciento de un mismo color
             mostrar_texto(x-len(porciento)/2, y, porciento[0:3],  
par_color, 13)
         elif i >= longitud/2+3:
             mostrar_texto(x-len(porciento)/2, y, porciento, par_color, 13)

         if i < longitud/2 or i > longitud/2+2:
             # antes y después de los caracteres de la cadena porciento
             mostrar_texto(x-longitud/2-1 + i, y, texto, par_color, 13)

         despues = time.localtime()
         # [5]: este índice corresponde a segundos en la tupla
         if despues[5] == antes[5]+i:
             i += 1
         elif despues[5]+60 == antes[5]+i:
             i += 1

         if i>longitud:
             retardo=False



# progressbar
# x, y, p1, longitud de la barra
p1 = 'manejo del proceso'
progressbar(xmax/2, ymax/2, p1, 30)

stdscr.getch()

fin_modo_mostrar_texto()
--------------------------------------

-- 
Saludos,

Luis Esteban de Dios Núñez

-----------------------------------
CONSULTE la Revista de Ciencias Medicas
de Pinar del Rio en Internet
www.revcmpinar.sld.cu

--

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas

Infomed: http://www.sld.cu/



More information about the pyar mailing list