RSS Feed
Feb 6

Python: Cronometro (pyqt4 – python 2.6)

Posteado el Sábado, 6 Febrero 2010 en Ayuda, General

Para hacer un cronometro vamos a recurrir al timer de python.

Empezamos por definir nuestra interfaz con “Designer”, en el cual incluimos 3 botones, y 1 etiqueta, donde incluimos el evento de salir desde la misma interfáz, y nos quedaría como muestra la figura.

Cronmetro hecho en Python

Una vez que compilamos nuestra interfáz con pyuic4 de la siguiente manera:

pyuic4 -o ui_clockwatch.py -x cronometro.ui

vamos a nuestra interfaz de desarrollo preferida y empezamos a escribir nuestro código.

Iniciamos con las importaciones, donde está nuestro interfaz que recién habíamos creado y en la segunda linea  incluimos la codificación para la escritura y así no tener problemas con los acentos y las ñ.

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

import time
import sys
from ui_clockwatch import Ui_watch
from PyQt4 import QtCore, QtGui
from PyQt4.QtGui import (QMessageBox, QMainWindow, QWidget, QApplication)
from PyQt4.QtCore import (Qt, SIGNAL, pyqtSignature, QBasicTimer)

Creamos nuestra clase principal donde inicializamos las variables, creamos nuestro timer:

class Clock(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
	self.ui = Ui_watch()
	self.ui.setupUi(self)

        #Inicializo variables
        self._start = 0.0
        self._elapsedtime = 0.0
        self._running = 0
        self._setTime(self._elapsedtime)

        #Creo mi Timer
        self.timer = QtCore.QBasicTimer()

Defino los eventos de los botones:

    @pyqtSignature("")
    def on_btn_start_clicked(self):
        try:
            """ Iniciar cronometro, ignorar si se está ejecutando. """
            if not self._running:
                self._start = time.time() - self._elapsedtime
                self._running = 1
                self.timer.start(100, self)
                self.ui.btn_start.setText("Detener")
            else:
                self.timer.stop()
                self._elapsedtime = time.time() - self._start
                self._setTime(self._elapsedtime)
                self.ui.btn_start.setText("Continuar")
                self._running = 0

        except:
            QMessageBox.warning(self, "Mensaje",
                            unicode("Error: Controlar el botón de inicio"))
    @pyqtSignature("")
    def on_btn_reset_clicked(self):
        """ Reinicio mi cronometro. """
        self._start = time.time()
        self._elapsedtime = 0.0
        self._setTime(self._elapsedtime)

Defino las funciones del timer y para configurar mi reloj:

    def timerEvent(self, event):
        try:
            """ Actualizo la etiqueta con tiempo remanente. """
            elap = time.time() - self._start
            """ Configuro el string con Minutos, segundo y centesimas de seg. """
            minutes = int(elap/60)
            seconds = int(elap - minutes*60.0)
            hseconds = int((elap - minutes*60.0 - seconds)*100)
            self.ui.lb_watch.setText('%02d:%02d:%02d' % (minutes, seconds, hseconds))

            # Paro mi reloj en 5 segundos
            if seconds==5:
              self.timer.stop()
              # Corrijo los milisegundos
              hseconds=00
              self.ui.lb_watch.setText('%02d:%02d:%02d' % (minutes, seconds, hseconds))

        except:
            QMessageBox.warning(self, "Mensaje",
                            unicode("Error: Controlar timer"))

    def _setTime(self, elap):
        """ Configuro el string con Minutos, segundo y centesimas de seg. """
        minutes = int(elap/60)
        seconds = int(elap - minutes*60.0)
        hseconds = int((elap - minutes*60.0 - seconds)*100)
        self.ui.lb_watch.setText('%02d:%02d:%02d' % (minutes, seconds, hseconds))

y por último creo mi aplicación.

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = Clock()
    myapp.show()
    sys.exit(app.exec_())

Aquí tienes el código para descargar.

Ver los comentarios

  1. sergio dice:

    hay alguna razon para que se me congele a los 5 segundos?? en principio cuenta hasta 5, y luego es como si no “refrescara” la aplicacion…..sobre todo lo pregunto porque estoy teniendo los mismos problemas con otras aplicaciones al refrescar textos, tablas etc

  2. mario alberto dice:

    usando el modulos time

  3. mario alberto dice:

    oie como le harias para imprimir cada 10 segundos un mensaje desde la consola responde por fabores urgente

  4. Alejandro Cruz dice:

    Muy bueno, lo he probado es justo lo que estaba buscando.
    Gracias

Escribe un comentario