[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