bonjour,

je tourne sous linux et j ai cree un petit programme me permettant de faire appel a une palette de couleur ou de rentrer le code hexa ou RGB et afficher la couleur.

sous linux, le programme fonctionne parfaitement, j ai voulu le "par::packer" pour que ma compagne puisse l utiliser sous vista.

l installation de par::packer a été faite par synaptic.

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
#!/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;
voici le code source du programme.

j essaie de creer le .exe avec "pp" par la ligne de commande :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
pp -o code_couleur.exe -M Tk -M Tk::Spectrum -M Tk::Photo -M Tk::PNG -M LWP::Simple -g -v 3 code_couleur.pl
le resultat donné par pp est sur http://pastebin.com/yMpPQS9t ( desolé trop long pour etre mis ici )

hors sous windows, rien n apparait.

quelqu'un aurait il une idée du pourquoi ou du comment ?

cordialement