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 :
- #!/usr/bin/perl
-
- use Tk;
- use strict;
-
- use Time::Local;
- use Math::Trig;
-
- # Create B<MainWindow> and canvas
- my $mw = MainWindow->new;
- $mw->title("Horloge");
- my $canvas = $mw->Canvas( -width=>640, -height=>480, -background=>"black");
- $canvas->pack(-expand => 1, -fill => 'both');
-
- my ($inFlags) = 0;
- my ($Cx,$Cy,$Rx,$Ry) = (320, 240, 200, 200);
- my ($XH,$YH,$XM,$YM,$XS,$YS) = (0, 0, 0, 0, 0, 0);
-
- sub drawClock() {
- my ($I,$R,$Tx,$Ty);
- for($I = 0; $I <= 59; $I++) {
- $R = $I * pi / 30;
- $Tx = int(cos($R) * $Rx) + $Cx;
- $Ty = int(sin($R) * $Ry) + $Cy;
- $canvas->createRectangle($Tx,$Ty,$Tx+5,$Ty+5, -fill=>"white");
- }
- for($I = 0; $I <= 11; $I++) {
- $R = $I * pi / 6;
- $Tx = int(cos($R) * $Rx) + $Cx;
- $Ty = int(sin($R) * $Ry) + $Cy;
- $canvas->createRectangle($Tx,$Ty,$Tx+8,$Ty+8, -fill=>"white");
- $canvas->createText(int(cos($R)*($Rx-15))+$Cx+3,int(sin($R)*($Ry-15))+$Cy+3,
- -text => (($I+2) % 12 + 1), -fill=>"white");
- }
- }
-
- sub anim() {
- if($inFlags > 0) {
- return;
- }
- $inFlags++;
-
- my @timelist = localtime(time());
- my ($Hour,$Min,$Sec) = ($timelist[2], $timelist[1], $timelist[0]);
-
- $canvas->createLine($Cx, $Cy, $XH, $YH, -width => 1, -fill=>"black");
- $canvas->createLine($Cx, $Cy, $XM, $YM, -width => 1, -fill=>"black");
- $canvas->createLine($Cx, $Cy, $XS, $YS, -width => 1, -fill=>"black");
-
- my $R = pi * ((30 * $Hour + ($Min >> 1))/180 + 1.5);
- $XH = $Cx + int(cos($R)*($Rx-35)) + 1;
- $YH = $Cy + int(sin($R)*($Ry-35)) + 1;
- $canvas->createLine($Cx, $Cy, $XH, $YH, -width => 1, -fill=>"red");
- $R = pi * ($Min / 30 + 1.5);
- $XM = $Cx + int(cos($R)*($Rx-20)) + 1;
- $YM = $Cy + int(sin($R)*($Ry-20)) + 1;
- $canvas->createLine($Cx, $Cy, $XM, $YM, -width => 1, -fill=>"yellow");
- $R = pi * ($Sec / 30 + 1.5);
- $XS = $Cx + int(cos($R)*($Rx-25)) + 1;
- $YS = $Cy + int(sin($R)*($Ry-25)) + 1;
- $canvas->createLine($Cx, $Cy, $XS, $YS, -width => 1, -fill=>"green");
-
- $inFlags--;
- }
-
- &drawClock();
- &anim();
- my $id = $mw->repeat(1000, \&anim);
- MainLoop;
Voici en terminant un exemple du résultat de se petit programme :
Dernière mise à jour : Jeudi, le 17 janvier 2019