Tikone

 

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 right

L'interface est moche, mais c'est purement utilitaire !


Voir également : http://www.lr-i.com/LRIco.html