miércoles, 25 de diciembre de 2013

Tutorial python gtk3 Spinner y ProgressBar

En muchas ocasiones necesitamos mostrar una pequeña señal de que algo esta pasando,cuando estamos ejecutando una tarea y necesitamos que algo este respondiendo a dicha acción,por ejemplo cuando descargamos algo,cuando movemos archivos,cuando salvamos un documento,etc.

En muchos casos de muchos sistemas vemos los spinners,loc cuales son un widget que giran o se hacen presentes hasta que son necesarios,por ejemplo en windows cuando esta una tarea ocupada vemos que el cursor se convierte en un spinner,luego en otros casos cuando necesitamos un dialogo mas preciso nos encontramos con las barras de progreso o progressbar en ingles,los barras de progreso nos muestran una información mas exacta en casos en los cuales los spinners no son suficientes,en este caso veremos como funcionan ambos widgets en Gtk3 + Python.

Spinner:

Para crear un spinner se usa el constructor Gtk.Spinner(),al cual le podemos pasar el parámetro active para que le digamos al constructor si queremos que comience en movimiento:

self.spinner = Gtk.Spinner(active=True) # Comienza en movimiento

self.spinner = Gtk.Spinner() # Comienza quieto

Las únicas dos funciones que tenemos en este widget es start y stop una para iniciar y otro para comenzar,vamos a crear una ventana de ejemplo para ver como funciona:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding: latin-1 -*-

from gi.repository import Gtk, GObject

class SpinnerEjemplo(Gtk.Window):

    def __init__(self):

        Gtk.Window.__init__(self, title="Spinner")
        self.set_border_width(5)
        self.connect("delete-event", Gtk.main_quit)
        self.vbox = Gtk.Box(spacing=5)
        self.button = Gtk.ToggleButton("Girar")
        self.button.connect("toggled", self.on_start) # Este boton manipula el spinner
        self.button.set_active(False)
        self.vbox.pack_start(self.button,True,False,10)
        
        self.spinner = Gtk.Spinner() # Creamos un spinner
        self.vbox.pack_start(self.spinner,True,False,10)

        self.add(self.vbox)
        self.show_all()

    def on_start(self, widget):

        if widget.get_active(): # widget es el boton si esta activo
            self.spinner.start() # Iniciamos el widget
            self.button.set_label("Detener")

        else: # Si no
            self.spinner.stop() # Lo detenemos
            self.button.set_label("Girar")


myspinner = SpinnerEjemplo()

Gtk.main()



Como vemos es muy simple mostrar un  spinner,en el caso del progressbar es un poco mas complicado pero a la vez esto nos da mas posibilidades de personalización y una mayor descripción de la situación:

ProgresBar:

Para crear un ProgressBar se usa el constructor Gtk.ProgressBar(),primero que nada vamos a crear un ejemplo sencillo:


1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- coding: latin-1 -*-

from gi.repository import Gtk, GObject

class SpinnerEjemplo(Gtk.Window):

    def __init__(self):

        Gtk.Window.__init__(self, title="Progressbar")
        self.set_border_width(5)
        self.connect("delete-event", Gtk.main_quit)
        self.vbox = Gtk.Box(spacing=5)
        self.button = Gtk.ToggleButton("Iniciar")
        self.button.connect("toggled", self.on_control) # Este boton manipula el spinner
        self.button.set_active(False)
        self.vbox.pack_start(self.button,True,False,10)
        self.progressbar = Gtk.ProgressBar() # Creamos un ProgressBar
        self.vbox.pack_start(self.progressbar,True,False,10)
       
        self.timeout_id = GObject.timeout_add(100, self.on_start, None) # Esta funcion es mantiene el ciclo de on_start
                                                                        # en milisegunos
        self.controller = False #  Creamos un controlador
        self.add(self.vbox)
        self.show_all()

    def on_control(self,widget):
        self.controller = widget.get_active() # Cambiamos el valor del controlador al valor del boton
        if self.controller:
           self.button.set_label("Pausar")
        else:
           self.button.set_label("Continuar")
       
    def on_start(self, widget): # Esta funcion se ejecuta cada 100 milisegundos basado en  el retorno de la misma
        if self.controller: # Si el controlador es True
            new_value = self.progressbar.get_fraction() + 0.01 # Añade una centecima
            if new_value > 1: # Si el valor es uno(completo)
                new_value = 0 # Reiniciamos a cero(vacio)
            self.progressbar.set_fraction(new_value) # Colocamos la fraccion
           
        return True

myspinner = SpinnerEjemplo()

Gtk.main()



Como vemos,he usado una función de la clase de ProgressBar,las cuales es:

set_fraction(new_value) # new_value es un entero a punto flotante 0,por ejemplo:

0.99,0.10,0.01,etc # 1 es lleno

También tenemos otras mas:

pulse() # Esta función hace que sea indefinida la barra de progreso,ya que solo va de un lado a otro.

set_inverted(bool) # Esta función invierte la forma que se llena el progressbar si el parámetro pasado es True.

set_orientation(orientacion) # Esta función cambia la forma de la orientación,por defecto es horizontal,pero podemos cambiarla a vertical pasandole como parámetro Gtk.Orientation.VERTICAL.

set_show_text("Porcentaje") # Muestra el progreso de la barra en porcentaje.

set_text("Texto") # Coloca texto a la barra.

De momento eso es todo,en otra ocasión veremos las labels,menus,etc.


2 comentarios:

  1. que tal!!!!tengo que dar gracias por mi y por los que van a llegar a ver este tutorial,como siempre muy bien explicado que al fin de cuentas es lo que mas importa a los que estamos empezando con Gtk3,gracias por tu tiempo y dedicacion.... desde ya esperamos los proximos tutoriales...

    ResponderBorrar

Los comentarios serán revisados antes de ser publicados.