1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
| #!/usr/bin/perl
### L image a été glané sur internet
### use
use Tk;
### pour la palette
use Tk::Spectrum;
### pour l affichage de l image en cas d erreur
use Tk::Photo;
use Tk::PNG;
use LWP::Simple;
### $fen est la fenetre principale
### $result est le "bouton" sur lequel on affiche la couleur
my ($fen,$result);
### ils contiennent tout les 3 la meme chose, soit en RGB, soit en hexa avec ou sans le #
my ($color,$r,$g,$b,$color_diese);
my $version = 0.01;
### test help et version
if (defined($ARGV[0])) {
if ( $ARGV[0] eq "-h" or $ARGV[0] eq "--help" ) {
print "code couleur hexa / RGB\n";
print "information : voir la documentation\n";
exit();
} elsif ( $ARGV[0] eq "-v" or $ARGV[0] eq "--version" ) {
print "0.01\n";
exit();
}
}
### check version
my $check = LWP::Simple::get("http://***********/perl/code_couleur_version.txt");
$check =~ s/\n//g;
if ( $version !~ $check ) {
&error("\nune version plus recente est disponible sur\n http://*********/perl\n\n");
}
### initialisation, il est mis dans une sub au cas ou un user mettrais une valeur impossible ( lettre ou chiffre )
sub init {
($color,$r,$g,$b) = ("000000","0","0","0");
$color_diese = "#".$color;
}
&init;
$fen = MainWindow->new();
$fen->title("Code Couleur");
$fen->minsize('380','127');
$fen->maxsize('380','127');
### permet de creer une nouvelle fenetre dans laquel on fait apparaitre le message d erreur
sub error {
### en option, il y a le message a faire apparaitre
my $a = shift;
my $fen2 = MainWindow->new();
### cela nous permet de faire disparaitre automatiquement au bout de 5 secondes la fenetre d erreur
$fen2->after(5000,sub { Tk::destroy($fen2); &init;});
$fen2->title("Erreur Code Couleur");
$fen2->minsize('380','127');
$fen2->maxsize('380','127');
### affichage du texte d erreur
$fen2->Label( -text => $a)->pack();
### affichage de l image
my $file = $fen2->Photo(-format => 'png', -file => 'Image\erreur.png');
$fen2->Button( -image => $file,-state =>'disabled',-relief => 'flat')->place(-x=>10,-y=>10);
}
### permet de faire apparaitre la palette et de modifier ainsi apres les variables color et RGB
sub palette {
### nous permet de faire apparaitre une interface plus jolie que chooseColor ou ColorEditor
$color_diese = $fen->Spectrum ( -title => 'Choisissez Une Couleur', -initialcolor => $color_diese, -buttons => [ 'Ok', 'Annuler' ] );
$color = $color_diese;
$color =~ s/^#//g;
($r,$g,$b) = (&hexatorgb2((split(//,$color))[0].(split(//,$color))[1]),&hexatorgb2((split(//,$color))[2].(split(//,$color))[3]),&hexatorgb2((split(//,$color))[4].(split(//,$color))[5]));
Tk::destroy($result);
&button;
}
sub hexa {
### je n utilise pas \x1B ou \x{263a} car F ou f n était pas pris en compte
### on verifie que l on traite bien de l hexadecimal
if ( $color =~ /^([0-9]|[a-f]|[A-F])*$/ ) {
### on convertit en décimal
my $a = hexatorgb2($color);
### on verifie que ce chiffre est bien entre 000000 et FFFFFF
if ( $a >= 0 && $a < 16777216 ) {
### on verifie que le code qui a été mis n est pas dans le genre FFF comme cela peut arriver en HTML, on rajoute alors la quantité necessaire de 0 devant
while (length($color) < 6) {
$color = "0".$color;
}
### les 2 lignes suivantes permettent de modifier les variables globales qui sont affichées dans les BrowseEntry
$color_diese = "#".$color;
### je split la valeur hexa FFFFFF en FF FF FF que j envoi en version decimal dans $RGB
($r,$g,$b) = (&hexatorgb2((split(//,$color))[0].(split(//,$color))[1]),&hexatorgb2((split(//,$color))[2].(split(//,$color))[3]),&hexatorgb2((split(//,$color))[4].(split(//,$color))[5]));
### on detruit et relance le bouton
Tk::destroy($result);
&button;
} else {
### envoi de l erreur chiffre trop grand ou trop petit
&error("\ndoit contenir un chiffre entre\n000000 et FFFFFF\n");
}
} else {
### envoi de l erreur caracteres non hexadecimaux
&error("\ndoit contenir uniquement\ndes caracteres hexadecimaux\n");
}
}
### on convertit en decimal le chiffre en hexa ( utilisé pour passer de RGB a hexa
sub hexatorgb2 {
my $a = shift;
return(hex($a));
}
### l inverse, pour passer d hexa a RGB donc d abord de FFFFFF a 3 variables FF FF FF puis a 255 255 255
sub rgbtohexa2 {
my $a = shift;
return(sprintf("%02x",$a));
}
### permet de verifier l hexa, identique a la sub hexa2
sub rgb2 {
### on verifie que nos 3 variables RGB sont bien en numériques
if ( $r =~ /^(\d)*$/ && $g =~ /^(\d)*$/ && $b =~ /^(\d)*$/) {
### que ce soit bien des chiffres compris entre 0 a 255
if ( $r <= 255 && $r >= 0 && $g <= 255 && $g >= 0 && $b <= 255 && $b >= 0 ) {
### on convertit en hexa nos chiffres décimaux
my ($r2,$g2,$b2) = (&rgbtohexa2($r),&rgbtohexa2($g),&rgbtohexa2($b));
### on les rassemble et modifie nos variables globales
$color = $r2.$g2.$b2;
$color_diese = "#".$color;
### on detruit et recree le bouton
Tk::destroy($result);
&button;
} else {
### erreur, chiffre non compris entre 0 et 255
&error("\ndoit contenir uniquement\ndes chiffres entre 0 et 255\n");
}
} else {
### erreur chiffres non décimaux
&error("\ndoit contenir uniquement\ndes caracteres decimaux\n");
}
}
### sub qui contient le bouton qui me sert a afficher la couleur, il est dans une sub comme ca, je peux y faire appel tres regulierement
sub button {
$result = $fen -> Button(-text=>" ",-background => '#'.$color,-state =>'disabled',-foreground => '#'.$color,-relief => 'flat',-width=>7,-height=>6)->place(-x => 285 , -y => 6);
}
### le design, rien de spécial ici
$fen->Label( -text => "Hexa : #")->place( -x=>8,-y=>10);
$fen->Entry( -textvariable=>\$color,-width => 19)->place(-x=>65,-y=>10);
$fen -> Button(-text=>"Hexa",-command=>[\&hexa])->place(-x => 215 , -y => 6);
$fen->Label( -text => "R :")->place( -x=>8,-y=>50);
$fen->Entry( -textvariable=>\$r,-width=>5)->place(-x=>30,-y=>50);
$fen->Label( -text => "G :")->place( -x=>75,-y=>50);
$fen->Entry( -textvariable=>\$g,-width=>5)->place(-x=>97,-y=>50);
$fen->Label( -text => "B :")->place( -x=>142,-y=>50);
$fen->Entry( -textvariable=>\$b,-width=>5)->place(-x=>164,-y=>50);
$fen -> Button(-text=>"RGB ",-command=>[\&rgb2])->place(-x => 215 , -y => 44);
$fen -> Button(-text=>"Palette",-command=>[\&palette],-width=>34)->place(-x => 8 , -y => 85);
### je fais appel en dernier ici a ma sub permettant d afficher le bouton
&button;
MainLoop; |
Partager