2012-01-19 18:14

PyQt Quickie: QTimer

QTimer es una clase sencillita: la usás cuando querés que algo pase "dentro de un rato" o "cada tanto".

El primer caso es así:

# llamar f() en 3 segundos
QTimer.singleShot(3000, f)

El segundo es así:

# Creamos un QTimer
timer = QTimer()
# Lo conectamos a f
timer.timeout.connect(f)
# Llamamos a f() cada 5 segundos
timer.start(5000)

¿Fácil, no? Bueno, sí, pero tiene un par de trampas.

  1. Hay que guardar la referencia a timer

    Si no, lo recoge el basurero, y nunca se llama a f()

  2. Capaz que son más de 5 segundos

    Va a llamar a f() más o menos cada 5 segundos después de que entre al event loop. Tal vez eso no sea enseguida después de que arrancás el timer!

  3. Capaz que se pisan las llamadas

    Si f() tarda mucho en terminar, y vuelve a entrar al event loop (por ejemplo, llamando a processEvents) tal vez timer se dispare antes que f() termine, y la llame de nuevo. Eso casi nunca es buena idea.

Una alternativa:

def f():
    try:
        # Hacé cosas
    finally:
        QTimer.singleShot(5000, f)

f()

Ese fragmento llama a f() una sola vez, pero ella misma se pone en cola para correr en 5 segundos. Ya que lo hace en un finally lo va a hacer aún si las cosas se rompen.

O sea, no se va a pisar. También quiere decir que no son 5 segundos, sino 5 más lo que tarde f. Y no hace falta guardar referencias al QTimer.

Último tipo: podés usar QTimer para que algo se haga "apenas estés en el event loop"

QTimer.singleShot(0, f)

¡Ojalá sirva!

Comentarios

Comments powered by Disqus

Contents © 2000-2019 Roberto Alsina