Introduction

Installation

Questions fréquemment posées

Syntaxe, mots-clés et fonctions intégrées

Distribution standard

Implémentation de import

Interface avec le navigateur

Modules intégrés propres à Brython

Travailler avec Brython

Recettes

 

module browser.timer

Implémente des fonctions pour permettre l'exécution différée ou répétitive de fonctions :

set_timeout(fonction,ms)
exécute la fonction après ms millisecondes. fonction ne prend aucun argument. Renvoie un objet utilisable dans la fonction suivante

Elle repose sur la fonction setTimeout en Javascript : voir la documentation officielle.

Sur cet exemple, la couleur du texte dans la boite noire change après 3 secondes.

from browser import document, timer

def change_color():
    document['st-text'].style.color = "blue"

def press_button(ev):
    timer.set_timeout(change_color, 3000)

document['first-button'].bind('click', press_button)

Cette couleur change au bout de 3s

clear_timeout(timer)
annule l'exécution définie par set_timeout(). Reçoit un argument, la valeur de l'objet retournée par set_timeout().

Elle repose sur la fonction cancelTimeout en Javascript. Voir la documentation officielle.

Reprenons l'exemple précédent. Vous avez maintenant la possibilité d'interrompre l'exécution de l'action avant que les 3 secondes soient écoulées.

from browser import document, timer

idtimer = 1

def change_color_two():
    document['ct-text2'].style.color = "blue"

def press_button_two(ev):
    global idtimer
    idtimer = timer.set_timeout(change_color_two, 3000)
    
def stop_button(ev):
    timer.clear_timeout(idtimer)

document['ct-start'].bind('click', press_button_two)
document['ct-stop'].bind('click', stop_button)


Cette couleur changera au bout de 3s

set_interval(fonction, ms)
lance l'exécution répétée de la fonction toutes les ms millisecondes. Renvoie un objet utilisable dans la fonction clear_interval décrite ci-dessous.

Elle repose sur la fonction setInterval de Javascript. Voir la documentation officielle.

Quand c'est possible il est préférable d'éviter de se servir de cette fonction et d'utiliser plutôt request_animation_frame (voir ci-dessous)

clear_interval(timer)
termine l'exécution répétée définie par set_interval()

Elle repose sur la fonction clearInterval de Javascript. Voir la documentation officielle.

Voici un exemple qui utilise set_interval et cancel_interval:

import time
from browser import document, timer

_timer = None
counter = 0

def show():
    document['_timer'].text = '%.2f' %(time.time()-counter)

def start_timer(ev):
    global _timer,counter
    if _timer is None:
        counter = time.time()
        _timer = timer.set_interval(show,10)
        document['start'].text = 'Pause'
    elif _timer == 'hold': # restart
        # restart timer
        counter = time.time()-float(document['_timer'].text)
        _timer = timer.set_interval(show,10)
        document['start'].text = 'Pause'
    else: # hold
        timer.clear_interval(_timer)
        _timer = 'hold'
        document['start'].text = 'Redémarrer'

def stop_timer(ev):
    global _timer
    timer.clear_interval(_timer)
    _timer = None
    t = 0
    document['_timer'].text = '%.2f' %0
    document['start'].text = 'Démarrer'

document['start'].bind('click', start_timer)
document['stop'].bind('click', stop_timer)


0.00

request_animation_frame(function)
provoque l'exécution répétée de la fonction en laissant le navigateur gérer la mise à jour. fonction prend un argument non significatif

Elle repose sur la fonction requestAnimationFrame de Javascript. Voir la documentation officielle.

cancel_animation_frame(id)
annule l'exécution répétée de la fonction définie par request_animation_frame() ; id est l'objet retourné par request_animation_frame()

Elle repose sur la fonction cancelAnimationFrame de Javascript. Voir la documentation officielle.

Voici un exemple dans lequel on utilise request_animation_frame et cancel_animation_frame :

from browser.timer import request_animation_frame as raf
from browser.timer import cancel_animation_frame as caf
from browser import document
import time
from browser.html import CANVAS, BUTTON
import math

ctx = document['raf-canvas'].getContext( '2d' ) 

toggle = True

def draw():
    t = time.time() * 3
    x = math.sin(t) * 96 + 128
    y = math.cos(t * 0.9) * 96 + 128
    global toggle
    if toggle:
        toggle = False
    else:
        toggle = True
    ctx.fillStyle = 'rgb(200,200,20)' if toggle else 'rgb(20,20,200)'
    ctx.beginPath()
    ctx.arc( x, y, 6, 0, math.pi * 2, True)
    ctx.closePath()
    ctx.fill()

def animate(i):
    global id
    id = raf(animate)
    draw()

def stop(i):
    global id
    caf(id)

document['btn-animate'].bind('click', animate)
document['btn-stop'].bind('click', stop)