Librairie tk › Les timers

FABRIQUER UN TIMER

 

FABRICATION d'un timer

Un timer est bien pratique pour lancer une séquence qui se répête selon une période ajustable .

Rafraichir l'heure, démarrer un chrono, changer une image toutes les X secondes, appuyer une touche pendant le déplacement d'un widget, etc... les utilisations sont multiples.

Voici comment procéder.

Nous allons faire une petite application avec deux boutons et un label de couleur qui changera de couleur toutes les secondes par exemple.

Elle ressemblera à ceci :

1) Création de variables de travail

Définissons deux variables :

  • etat sera une variable pour savoir quelle couleur afficher ( etat 0 (rouge) ou 1 (vert))
  • tempo sera la période en milliseconde (ici 200ms)
set etat 0
set tempo 200

2) Création de l'interface

Créons maintenant deux boutons et un label

  • un bouton start pour démarrer le timer
  • Un bouton stop pour l'arrêter
  • Un label rouge qui fait office de led (rouge vert rouge vert etc...)

pack [button .b1 -text "start" -command {every $tempo timer; .b1 configure -state disabled; .b2 configure -state normal;}] -fill x
pack [button .b2 -text "stop" -command {stop; .b2 configure -state disabled; .b1 configure -state normal;}] -fill x
pack [label .l3 -bg red] -fill x

3 ) Création du timer

Créons cette procédure qui aura pour effet de créer un timer:

proc every {ms body} {eval $body; after $ms [info level 0]}

 

Nous avons donc un widget prêt à l'emploi qui, avec ces 3 procédures crée un timer exploitable et qui ne bloque pas l'application comme lorsqu'on utilise la commande after.

 

 

Pour voir un autre exemple , j'ai fait un métronome analogique dans la catégorie multimédia.

Regardez et analysez le code.

 

Merci pour votre attention.

Merci à Csaba pour son aide précieuse.

 

6) Code complet de l'exemple

set etat 0
set tempo 200
pack [button .b1 -text "start" -command {every $tempo timer; .b1 configure -state disabled; .b2 configure -state normal;}] -fill x
pack [button .b2 -text "stop" -command {stop; .b2 configure -state disabled; .b1 configure -state normal;}] -fill x
pack [label .l3 -bg red] -fill x


proc every {ms body} {eval $body; after $ms [info level 0]}

proc timer {} {
	global etat
	# change picture
	switch $etat {
		0 {.l3 configure -bg green; global etat; set etat 1}
		1 {.l3 configure -bg red; global etat; set etat 0}
	}
}

proc stop {} {
	.l3 configure -bg red
	  after cancel [after info]
}

 

Procedure pour les dates et les heures

Pour simplifier le code , j'ai créé de petites procédures pour avoir l'heure, la date, le mois ,l'année etc.. ci-dessous :

obtenir l'année actuelle

Voici le code à insérer :

proc Year {} {
return [clock format [clock seconds] -format  "%Y"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Year]

Le résultat sera un numéro sur 4 digits correspondant à l'année comme ceci :  2025

obtenir le mois actuel

Voici le code à insérer :

proc Month {} {
return [clock format [clock seconds] -format  "%B"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Month]

Le résultat sera le nom du mois en Anglais comme ceci :   January

obtenir la semaine actuelle

Voici le code à insérer :

proc Week {} {
return [clock format [clock seconds] -format  "%W"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Week]

Le résultat sera le numéro de semaine actuel comme ceci:    10

obtenir le jour actuel

Voici le code à insérer :

proc Day {} {
return [clock format [clock seconds] -format  "%A"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Day]

le résultat de la console sera le jour au format anglais comme ceci : Saturday

obtenir l'heure actuelle

Voici le code à insérer :

proc Hour {} {
return [clock format [clock seconds] -format  "%H"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Hour]

le résultat de la console sera le jour au format anglais comme ceci : 11

 

obtenir les minutes actuelles

Voici le code à insérer :

proc Minute {} {
return [clock format [clock seconds] -format  "%M"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Minute]

le résultat de la console sera le jour au format anglais comme ceci : 15

 

obtenir les secondes actuelles

Voici le code à insérer :

proc Second {} {
return [clock format [clock seconds] -format  "%S"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Second]

le résultat de la console sera le jour au format anglais comme ceci : 23

 

obtenir les heures minutes secondes actuelles

Voici le code à insérer :

proc Time {} {
return [clock format [clock seconds] -format  "%H:%M:%S"]
}

Il suffit simplement de l'appeler par cette commande :

puts [Time]

Le résutat sera les heures minutes secondes séparés par le symbole deux points) comme ceci : 11:13:15

 

 

 

 

 

 

 

 

 

 

 

 Retour au sommaire librairie TK