Python. Modulo TTK. Mapas de estilo para widget ttk.Progressbar, Ejemplo 2.

A continuación se muestra un programa que utiliza un widget temático ttk.Progressbar para mostrar el progreso de una tarea que se ejecuta en segundo plano (subproceso) durante la ejecución de nuestro programa. En esta ocasión también utilizaremos un mapa de estilos para personalizar la apariencia de la barra de progreso.

En una computadora se pueden ejecutar múltiples procesos o múltiples hilos (threads) dentro de un único proceso. Una computadora tiene la capacidad de ejecutar multiples procesos y subprocesos a la vez.  En el idioma español un sinónimo de multiproceso es multitareas (del inglés multitasking) el cual consiste en la ejecución de uno o más procesos concurrentes en un sistema. 

El programa tendrá una apariencia como se muestra abajo que tendra un bóton en la ventana principal que, al pulsarlo, simula el inicio de una tarea que tardará 10 segundos aproximadamente en ejecutarse. Durante ese tiempo, el bóton quedará deshabilitado y aparecerá un etiqueta de porcentaje y una barra de progreso que ira mostrando el avance realizado hasta su finalización, momento en el que la etiqueta y la barra de progreso desaparecerán y el bóton volverá a habilitarse.


GUI de inicio del programa.

Al presionar el bóton 'inicio' aparecerá la etiqueta de 
porcentaje y barra de progreso.

Al pasar el puntero del ratón sobre la barra de progreso
cambiara la apariencia del mismo.

Es hora de poner manos a la obra padawans.

En esta primera sección del programa declararemos las líbrerias  tkinter, time y thereading asi como las clases que utilizaremos, también apareceran las sentencias que crean la ventana principal  (raiz). Y las sentencias para configurar el tema que establecerá la apariencia del GUI para el programa. 



La función Sub_Proceso1() es la encargada de simular la tarea que se ejecutará en segundo plano, esta función inicia un subproceso concurrente con el flujo principal de la aplicación para no bloquear la interfaz mientras se ejecuta.

Al inicio de esta función el widget que corresponde al botón <Inicio> es deshabilitado mientras el subproceso se este ejecutando, posteriormente con el método .grid() se posicionan en pantalla la etiqueta de porcentaje y la barra de progreso. Como mencionamos el subproceso tendrá una duración de 10 segundos, este tiempo lo determina el ciclo de repetición del bucle 'for' que es igual a 20 multiplicado por los 0.5 seg del tiempo de espera establecido por el método .sleep(). A modo de práctica cambie esta duración para hacer que el  tiempo de la tarea dure 30 segundos o 60 segundos.

Al concluir el bucle 'for' el programa muestra la barra de progreso con 100% de la tarea completada durante 2 segundos, momento en el que el valor del indicador de la barra de progreso es reiniciado a '0', la etiqueta de porcentaje es actualizada y ocultada, la barra de progreso es ocultada y el bóton <inicio> es habilitado nuevamente. El subproceso concluye cuando el programa termina esta función.



Al presionar el bóton <Inicio> la opción command de este widget llama a la funcion Arrancar_SubProceso1() la cuál crea una instancia de clase Thread (hilo), cuyo argumento es el nombre de la función que contiene el código del subproceso en este caso Sub_Proceso1(), la siguiente sentencia llama al método .start() que es el encargado de arrancar el hilo con el nombre del subproceso indicado.


Para finalizar, se muestra el bloque de programa que hace que nuestros widgets mantengan una distribucion en la ventana principal cuando se tenga un tamaño personalizado o cuando ocupe todo el ancho de la pantalla (experimente poniendo entre comentarios las dos instrucciones que inican con raiz.clumnconfigure(*)). Las siguientes sentencias crean y posicionan el bóton de <inicio> que es el encargado de poner en marcha el subproceso.

Posteriormente las sentencias que continuan son las que crean la etiqueta de porcentaje y las que crean la barra de progreso con el mapa de estilos personalizado que deseamos, sin embargo observe que son creados pero no posicionados en la ventana principal, ya que esto se hace en la función Sub_Proceso1(). Experimente cambiando los colores de la etiqueta miPorcentaje1 y cambiando los colores de la barra de progreso en el mapa de estilo estilo.map("TProgressbar", *).

La última sentencia permitirá atender los eventos que se produzcan durante el uso del programa.




"El talento no se puede enseñar, pero se puede despertar"

 

Comentarios