Atelier 3e

 

David Cobac Cette page est dédiée aux élèves participant à l'atelier de programmation tcl. Il suit l'atelier d'utilisation de tortue et de la modification de son interface.


1er projet : l'horloge proposée par Valentin K.

Script jeudi 12 mai

Les erreurs générées par le code précédent ont été mises en évidence. On traite alors la chose à la source : directement sur le clock seconds, ce qui nous allège (en plus) le code.

 # définition des procédures
 proc actualiseHeure {} {
     global decalage
     set hs [expr {[clock seconds]+3600*$decalage}]
     set h [clock format $hs -format "%H:%M:%S"]
     .heure configure -text $h
     after 1000 actualiseHeure
 }

 proc changeDecalage {} {
     global decalage dec
     set decalage $dec([.l get active])
 }

 # mon interface
 listbox .l  -height 1 -width 10
 label .heure -width 8
 pack .l .heure -side left
 focus .l
 bind .l <<ListboxSelect>> changeDecalage

 # le tableau des villes
 set Tableau {Paris France 0 Londres Angleterre -1}

 # traitement du tableau
 foreach {v p d} $Tableau {
     .l insert end $v
     set dec($v) $d
 }

 set decalage $dec(Paris)
 # on lance
 actualiseHeure

Script jeudi 14 avril

Les problèmes que rencontre ce script sont encore nombreux :

mais c'est une première solution naïve.

 # définition des procédures
 proc actualiseHeure {} {
     global decalage
     set hs [clock seconds]
     set h [clock format $hs -format "%H %M %S"]
     foreach {H M S} $h break
     set H [expr {$H+$decalage}]
     .heure configure -text $H:$M:$S
     after 1000 actualiseHeure
 }

 proc changeDecalage {} {
     global decalage dec
     set decalage $dec([.l get active])
 }

 # mon interface
 listbox .l  -height 1 -width 10
 label .heure -width 8
 pack .l .heure -side left
 focus .l
 bind .l <<ListboxSelect>> changeDecalage

 # le tableau des villes
 set Tableau {Paris France 0 Londres Angleterre 1}

 # traitement du tableau
 foreach {v p d} $Tableau {
     .l insert end $v
     set dec($v) $d
 }

 set decalage $dec(Paris)
 # on lance
 actualiseHeure

AM (18 avril 2005) La solution pour les heures du matin est de remplacer $H en expr {$H+$decalage} par ($H=="00"?0:[string trimleft $H 0]). C'est-a-dire:

Le fragment ci-dessus est bien compact, mais c'est peut-etre mieux qu'on utilise la commande "if":

   if { $H == "00" } {
      set H 0 ;#
   } else {
      set H [string trimleft $H 0]
   }

Une autre solution, qui use des proprietes subtiles de la commande [expr] relatees a "parsing" et la compilation interne, est:

   set H [expr "[string trimleft $H 0]+$decalage]"]

Notez les "quotes" en lieu des accolades - ils forcent une recompilation de l'expression.

Si on ajoute l'operateur x%y, on peut soluer le dernier probleme aussi:

   set H [expr "([string trimleft $H 0]+$decalage])%24"]

Un autre petit probleme: Londres a un decalage de -1 heure :).

David Cobac Merci pour cette participation au projet Arjen !

j'avais prévu pour la suite une utilisation de clock scan pour enlever/ajouter directement des nombres d'heures. Cela évitera l'utilisation de % et en plus cela éclaircit considérablement le code (c'est alors terminé de récupérer les heures, les minutes et les secondes ...). J'ai par contre pas essayé d'enlever/ajouter des demi-heures (il y a des décalages en demi-heure dans le monde).

Pour le décalage de Londres...merci (je l'ai mis un peu au hasard en fait ! faudrait que je me renseigne :)

Script lundi 11 avril

Voir aussi la page de listbox avec dans la section Bindings par défaut où l'on parle de l'événement <<ListboxSelect>>.

 # définition des procédures
 proc actualiseHeure {} {
     set hs [clock seconds]
     set h [clock format $hs -format "%H:%M:%S"]
     .heure configure -text $h
     after 500 actualiseHeure
 }

 proc changeDecalage {} {
     set ville [.l get active]
     set decalage $dec($ville)
 }

 # mon interface
 listbox .l  -height 1
 label .heure -width 10
 pack .l .heure -side left
 focus .l
 bind .l <<ListboxSelect>> changeDecalage

 # le tableau des villes
 set Tableau {Paris France 0 Londres Angleterre 1}

 # traitement du tableau
 foreach {v p d} $Tableau {
     .l insert end $v
     set dec($v) $d
 }

 set decalage $dec(Paris)
 # on lance
 actualiseHeure

Script jeudi 7avril 2005

 proc actualiseHeure {} {
     set hs [clock seconds]
     set h   [clock format $hs -format "%H:%M:%S"]
     .heure configure -text $h
     after 500 actualiseHeure
 }

 # mon interface
 listbox .l  -height 1
 label .heure -width 10
 pack .l .heure -side left
 focus .l

 # le tableau des villes
 set Tableau {Paris France +0 Londres Angleterre +1}

 foreach {v p d} $Tableau {
     .l insert end $v
 }

 # on lance
 actualiseHeure