bonjour,

quand j'ai besoin d'un code couleur ( genre #FFFFFF ), a chaque fois, je démarrais Gimp et donc, je devais attendre le chargement, et ainsi de suite, bref, ça m’embêtait un petit peu.

j'ai fait ce petit bout de code, qui est fonctionnel, donc aucun soucis par rapport a cela.
mais je voudrais savoir si le code peut-être amélioré.

le résultat final donne ceci :

le code est celui-ci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/perl
 
### code couleur
### permet d acceder facilement a un code couleur
 
#This file is part of code_couleur.
#
#    code_couleur is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    code_couleur is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with code_couleur.  If not, see <http://www.gnu.org/licenses/>.
 
### L image a été glané sur internet mais je ne me rappelle plus ou :/
 
### use
use strict;
use warnings;
use Tk;
### pour la palette
use Tk::Spectrum;
### pour l affichage de l image en cas d erreur
use Tk::Photo;
use Tk::PNG;
### verification d'un update
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://deliriazone.free.fr/perl/code_couleur_version.txt");
$check =~ s/\n//g;
if ( $version !~ $check ) {
	&error("\nune version plus recente est disponible sur\n http://deliriazone.free.fr/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
			my @tmp = split(//,$color);
			($r,$g,$b) = (&hexatorgb2($tmp[0].$tmp[1]),&hexatorgb2($tmp[2].$tmp[3]),&hexatorgb2($tmp[4].$tmp[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;
merci d'avance.

cordialement

ours