Accueil de Gladir.com Notes légales de Gladir.com Flux RSS des nouvelles du site Gladir.com - Langage de programmation - Perl - Temps - Horloge à aiguille Section du logiciel DOS «MonsterBook» Inventaire de la bibliothèque de Gladir.com Entrée administrateur

Rien de tel que pour rendre intéressant l'affichage de l'heure, que d'effectuer l'affichage d'une horloge à aiguille ! Avant de commencer assurez-vous d'avoir installé le paquet Tk approprié comme l'exemple suivant :

C:\>ppm install Tk

Voici le code source Perl :

  1. #!/usr/bin/perl
  2.  
  3. use Tk;
  4. use strict;
  5.  
  6. use Time::Local;
  7. use Math::Trig;
  8.  
  9. # Create B<MainWindow> and canvas
  10. my $mw = MainWindow->new;
  11. $mw->title("Horloge");
  12. my $canvas = $mw->Canvas( -width=>640, -height=>480, -background=>"black");
  13. $canvas->pack(-expand => 1, -fill => 'both');
  14.  
  15. my ($inFlags) = 0;
  16. my ($Cx,$Cy,$Rx,$Ry) = (320, 240, 200, 200);
  17. my ($XH,$YH,$XM,$YM,$XS,$YS) = (0, 0, 0, 0, 0, 0);
  18.  
  19. sub drawClock() {
  20.   my ($I,$R,$Tx,$Ty);
  21.   for($I = 0; $I <= 59; $I++) {
  22.    $R = $I * pi / 30;
  23.    $Tx = int(cos($R) * $Rx) + $Cx;
  24.    $Ty = int(sin($R) * $Ry) + $Cy;
  25.    $canvas->createRectangle($Tx,$Ty,$Tx+5,$Ty+5, -fill=>"white");
  26.   }
  27.   for($I = 0; $I <= 11; $I++) {
  28.    $R = $I * pi / 6;
  29.    $Tx = int(cos($R) * $Rx) + $Cx;
  30.    $Ty = int(sin($R) * $Ry) + $Cy;
  31.    $canvas->createRectangle($Tx,$Ty,$Tx+8,$Ty+8, -fill=>"white");
  32.    $canvas->createText(int(cos($R)*($Rx-15))+$Cx+3,int(sin($R)*($Ry-15))+$Cy+3,
  33.                                -text => (($I+2) % 12 + 1), -fill=>"white");
  34.   }
  35. }
  36.  
  37. sub anim() {
  38.  if($inFlags > 0) {
  39.   return;
  40.  }
  41.  $inFlags++;
  42.  
  43.  my @timelist = localtime(time());
  44.  my ($Hour,$Min,$Sec) = ($timelist[2], $timelist[1], $timelist[0]);
  45.  
  46.  $canvas->createLine($Cx, $Cy, $XH, $YH, -width => 1, -fill=>"black");
  47.  $canvas->createLine($Cx, $Cy, $XM, $YM, -width => 1, -fill=>"black");
  48.  $canvas->createLine($Cx, $Cy, $XS, $YS, -width => 1, -fill=>"black");
  49.  
  50.  my $R = pi * ((30 * $Hour + ($Min >> 1))/180 + 1.5);
  51.  $XH = $Cx + int(cos($R)*($Rx-35)) + 1;
  52.  $YH = $Cy + int(sin($R)*($Ry-35)) + 1;
  53.  $canvas->createLine($Cx, $Cy, $XH, $YH, -width => 1, -fill=>"red");
  54.  $R = pi * ($Min / 30 + 1.5);
  55.  $XM = $Cx + int(cos($R)*($Rx-20)) + 1;
  56.  $YM = $Cy + int(sin($R)*($Ry-20)) + 1;
  57.  $canvas->createLine($Cx, $Cy, $XM, $YM, -width => 1, -fill=>"yellow");
  58.  $R = pi * ($Sec / 30 + 1.5);
  59.  $XS = $Cx + int(cos($R)*($Rx-25)) + 1;
  60.  $YS = $Cy + int(sin($R)*($Ry-25)) + 1;
  61.  $canvas->createLine($Cx, $Cy, $XS, $YS, -width => 1, -fill=>"green");
  62.  
  63.  $inFlags--;
  64. }
  65.  
  66. &drawClock();
  67. &anim();
  68. my $id = $mw->repeat(1000, \&anim);
  69. MainLoop;

Voici en terminant un exemple du résultat de se petit programme :

Dernière mise à jour: Mardi, le 3 janvier 2012