Vincent VERDON le 05 mars 2009
Ayant marre de chercher à chaque fois fois le mode d'emploi pour changer les icônes de mes exécutables wrappés à l'aide freeWrap, je me suis fait un petit utilitaire graphique qui fait cela presque tout seul : tikone.tcl. Ce script utilise la bibliothèque de Aaron Faupell extraite de la tklib. Il est constitué de 2 panneaux : * le panneau de gauche permet d'ouvrir un fichier exe ou ico, d'en extraire les icônes et de les afficher. * le panneau de droite permet d'ouvrir un fichier image, de l'afficher. on peut ensuite échanger un icône du fichier de gauche avec l'image de droite, ou encore sauvegarder un icône du fichier exe pour s'en servir ailleurs.
Le script :
#!/usr/bin/env wish
####################################################################
#Programme écrit par V. Verdon
#Tikone est un utilitaire pour modifier les icones des executables Windows
#placé sous licence GNU GPL (consulter le fichier joint intitulé "licence.txt"
####################################################################
set version 20122007
################################################################################
proc dialog_ouvrir_exe {} {
set types {
{{Fichier exe} {.exe}}
{{Fichier ico} {.ico}}
}
set ::f_exe [tk_getOpenFile -defaultextension {.exe} -filetypes $types -title {Nom du fichier exe}]
if {$::f_exe == {}} {
return
}
ouvrir_exe $::f_exe
}
################################################################################
proc ouvrir_exe {f} {
set ::icos [::ico::getIconList $f]
set nb_icos [llength $::icos]
destroy .f.f1.f
labelframe .f.f1.f -text {Liste des icones contenues dans le fichier} -foreground blue
pack .f.f1.f -fill both -expand 1
for {set i 0} {$i < $nb_icos} {incr i} {
creer_frame_icone $i
}
}
################################################################################
proc dialog_ouvrir_image {} {
set types {
{{Tout type} {*.*}}
{{Images GIF} {.gif}}
{{Icones ICO} {.ico}}
}
set ::f_image [tk_getOpenFile -filetypes $types -title {Nom de l'image à insérer}]
if {$::f_image == {}} {
return
}
ouvrir_image $::f_image
}
################################################################################
proc ouvrir_image {f} {
if {[file extension $f] == {.ico}} {
set ::im [::ico::getIcon $f 0 -format image]
} else {
set ::im [image create photo -file $f]
}
.f.f2.f.im configure -image $::im
set h [image height $::im]
set l [image width $::im]
.f.f2.f.l configure -text "$h x $l"
}
################################################################################
proc creer_frame_icone {i} {
set ::img($i) [::ico::getIcon $::f_exe $i -format image]
frame .f.f1.f.f$i
pack .f.f1.f.f$i
radiobutton .f.f1.f.f$i.b -image $::img($i) -variable ::select -value $i
pack .f.f1.f.f$i.b -side left
label .f.f1.f.f$i.l -text [lindex $::icos $i]
pack .f.f1.f.f$i.l -side left
}
################################################################################
proc ecrire_icone {f n image} {
set prof [lindex $::icos $n]
set prof [lindex $prof 2]
::ico::writeIcon $f $n $prof $image
ouvrir_exe $::f_exe
}
################################################################################
proc dialog_enregistrer_icone {} {
set types {
{{Fichier ico} {.ico}}
}
set f_ico [tk_getSaveFile -defaultextension {.ico} -filetypes $types -title {Nom du fichier ICO}]
if {$f_ico == {}} {
return
}
ecrire_icone $f_ico 0 $::img($::select)
}
################################################################################
set rep [info nameofexecutable]
if {[file extension [string tolower $rep]] == {.exe}} {
# il s'agit d'un script wrappé sous Windows (freewrap)
set rep [file dirname $rep]
} else {
# le script est lancé avec l'interpréteur wish
set rep [file dirname [file normalize [info script]]]
}
source [file join $rep ico.tcl]
# wm geometry . 640x300
set select {0}
set f_exe {}
set f_image {}
frame .f -relief sunken -borderwidth 2
pack .f -fill both -expand 1
# frame fichier exe
frame .f.f1 -relief sunken -borderwidth 2
pack .f.f1 -fill both -side left -expand 1
# boutons
frame .f.f1.fb -relief sunken -borderwidth 2
pack .f.f1.fb -fill x
button .f.f1.fb.b1 -text {Ouvrir un .exe} -command {dialog_ouvrir_exe}
pack .f.f1.fb.b1 -side left
button .f.f1.fb.b2 -text {Remplacer l'icone} -command {ecrire_icone $f_exe $select $im}
pack .f.f1.fb.b2 -side left
button .f.f1.fb.b3 -text {Extraire l'icone} -command {dialog_enregistrer_icone}
pack .f.f1.fb.b3 -side left
label .f.f1.info -text {Fichier exe ou ico dans lequel les icones doivent être modifiées} -wraplength 200
pack .f.f1.info
# frame de stockage des icones
labelframe .f.f1.f -text {Liste des icones contenues dans le fichier} -foreground blue -background white
pack .f.f1.f -fill both -expand 1
# frame image
frame .f.f2 -relief sunken -borderwidth 2
pack .f.f2 -fill both -side left -expand 1
# boutons
frame .f.f2.fb -relief sunken -borderwidth 2
pack .f.f2.fb -fill x
button .f.f2.fb.b1 -text {Ouvrir une image} -command {dialog_ouvrir_image}
pack .f.f2.fb.b1 -side left
label .f.f2.info -text {Cette image est destinée à remplacer un icone du fichier exe de gauche} -wraplength 150
pack .f.f2.info
# frame de stockage d'image
labelframe .f.f2.f -text {Image à insérer} -foreground blue -background white
pack .f.f2.f -fill both -expand 1
label .f.f2.f.im -background white
pack .f.f2.f.im
label .f.f2.f.l -background white
pack .f.f2.f.l
# frame des boutons
frame .fb -relief sunken -borderwidth 2
pack .fb -fill x
button .fb.b2 -text {Quitter} -command {exit}
pack .fb.b2 -side rightL'interface est moche, mais c'est purement utilitaire !
Voir également : http://www.lr-i.com/LRIco.html