PyQt Quickie: QTimer
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.
-
Hay que guardar la referencia a
timer
Si no, lo recoge el basurero, y nunca se llama a f()
-
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! -
Capaz que se pisan las llamadas
Si
f()
tarda mucho en terminar, y vuelve a entrar al event loop (por ejemplo, llamando aprocessEvents
) tal vez timer se dispare antes quef()
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!
Gracias! Me ha servido de mucho!
Very helpful and simple tutorial. Thank You!