Tutorial de PyQt. Barra de progreso. Parte 9.

Posted on sáb 13 agosto 2011 in Tutorial de Python y PyQt • 3 min read

Continuando con la serie de artículos sobre PyQt en este caso se tratará sobre el widget de la barra de progreso.

Se utilizarán los siguientes widgets:

  • Qbutton: Botón de iniciar y detener la barra de progreso y el botón salir.
  • QProgressBar: Es el widget de la barra de progreso.
  • QTimer: Provee un timer que es quien maneja el progreso de la barra.

Se tiene la barra de progreso que se inicia cuando se le da clip al botón, se incrementa la barra hasta llegar a 100, el botón que inicia la barra sirve también para detenerlo, volver a arrancar el progreso, cuando se llega a 100 el botón se coloca otra vez para iniciar la barra, colocando el contador en cero para poder iniciar de cero el incremento. Se tiene un botón para salir de la aplicación.

El código del programa se muestra a continuación:

#!/usr/bin/env python

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore


class App(QtGui.QWidget):
    def __init__(self,parent=None):
        QtGui.QWidget.__init__(self, parent)
        #Se define el tamano de la ventana
        self.setGeometry(400, 400, 250, 150)
        #Se le coloca un titulo a la ventana y se asocia un icono.
        self.setWindowTitle('Barra de progreso')
        self.setWindowIcon(QtGui.QIcon('./openlogo-50.png'))

        #Se definen los widgets a utilizar en la ventana.
        #Se crea la instancia de la barra de progreso.
        self.pbar = QtGui.QProgressBar(self)
        #Se crea el boton que inicia/detiene la barra de progreso
        self.button = QtGui.QPushButton('Iniciar', self)
        #Se define una politica al boton de no foco
        self.button.setFocusPolicy(QtCore.Qt.NoFocus)
        #Se define el boton salir.
        self.quit = QtGui.QPushButton('Salir', self)

        #Se crea la instancia timer con el contador en cero
        self.timer = QtCore.QBasicTimer()
        self.step = 0

        #se asocia los eventos de los 2 botones. 
        self.connect(self.button, QtCore.SIGNAL('clicked()'),self.Accion)
        self.connect(self.quit, QtCore.SIGNAL('clicked()'),QtGui.qApp, QtCore.SLOT('quit()'))

        #Se define como empaquetar los widgets.
        #En este caso se usa grilla.
        #Se crea la instancia
        grid = QtGui.QGridLayout()
        grid.setSpacing(10)
        #Se agrupan los widgets pasando el
        #objeto luego el orden en vertical, el orden en
        #horizontal.
        grid.addWidget(self.pbar, 1, 0)
        grid.addWidget(self.button, 2, 0)
        grid.addWidget(self.quit, 3, 1)
        #Se define el layout pasando la grilla
        self.setLayout(grid)



    def timerEvent(self, event):
        #funcion asociada al timer.
        #Si el contador llega a 100
        #Se detiene el timer, se cambia el titulo
        #del boton, se coloca el contador en cero
        #y se sale de la funcion.
        #Si no llega a 100, se incrementa en 1 el contador y
        #se le asigna un nuevo valor a la barra de progreso.
        if self.step >= 100:
            self.timer.stop()
            self.button.setText('Iniciar')
            self.step = 0
            return
        self.step = self.step + 1
        self.pbar.setValue(self.step)

    def Accion(self):
        #Si el timer esta activo se detiene y se
        #le cambia el titulo al boton con Iniciar.
        if self.timer.isActive():
            self.timer.stop()
            self.button.setText('Iniciar')
        else:
            #Si no esta activo el timer, se inicia con valor de 100
            #se coloca el titulo detener al boton.
            self.timer.start(100, self)
            self.button.setText('Detener')

#Se ejecuta el programa principal
if __name__ == "__main__":    
   #Se instancia la clase QApplication    
   app = QtGui.QApplication(sys.argv)    
   #Se instancia el objeto QuitButton    
   qb = App()    
   #Se muestra la aplicacion    
   qb.show()    
   #Se sale de la aplicacion    
   sys.exit(app.exec_())

===

¡Haz tu donativo! Si te gustó el artículo puedes realizar un donativo con Bitcoin (BTC) usando la billetera digital de tu preferencia a la siguiente dirección: 17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV

O Escaneando el código QR desde billetera:

17MtNybhdkA9GV3UNS6BTwPcuhjXoPrSzV *