Installer Tk sur une distribution de Perl récente

Ce n'est pas un sujet qui va révolutionner la blogosphère, mais il m'a pris un peu de temps. Je suis donc sûr qu'un jour un internaute sera content de trouver ici deux ou trois astuces qui lui épargneront de longues recherches. Si tu es celui-ci, Perlophile, fais-moi un signe.
5 commentaires Donner une note à l'article (5)

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

I. Perl

Perl est un interpréteur qui fonctionne aussi bien sur UNIX que sur Windows. Ça tient un peu du C avec la magie des expressions régulières. Si c'est magique : on le reprend six mois plus tard et s'il n'y a pas de commentaire on n'y comprend rien.

Une ressource indispensable, le O'Reilly "programmer en Perl" dont c'est la 4e édition.

Image non disponible

C'est avec Perl que je développe des scripts depuis des années. Ayant beaucoup navigué d'une fonction à l'autre, je l'ai parfois délaissé, mais j'y suis toujours revenu en fin de compte.

L'avantage de ce langage est qu'il est multiplateforme (on l'a déjà dit) et qu'il existe de nombreux modules qui étendent ses possibilités (accès aux bases de données, compression de fichier, lancement de commandes système, la gestion de fenêtres, traitement des URL…). Je l'utilise sur Windows et une bonne partie de mon article s'applique à cet OS.

Depuis… longtemps, j'utilise les distributions d'ActiveState nommées… ActivePerl.

Ils proposent des versions pour les entreprises avec des options de support ainsi qu'une version gratuite. Et pour la version gratuite, il faut se débrouiller avec Internet.

II. Les modules

Ils sont souvent développés par des développeurs ou des groupes de développeurs à la marge du projet principal. De ce fait, leur pérennité et leur distribution au sein de telle ou telle distribution ne sont pas garanties.

Et c'est comme ça que Tk est sorti de la distribution ActivePerl depuis… la mort de son développeur (si j'ai bien tout compris).

II-A. Installer des modules automatiquement

Bien entendu, ActivePerl fournit un outil qui permet d'installer ou de mettre à jour des modules. Il s'appelle Perl Package Manager ou PPM.

Image non disponible

Il permet de visualiser la version de chaque module et de le mettre à niveau depuis les serveurs d'ActiveState (ou d'autres).

Image non disponible

Encore faut-il que votre poste ou votre serveur puisse accéder directement à Internet.

II-B. Installer manuellement

Là réside l'astuce de l'astuce (et encore, il y en a une autre).

Les packages des modules sont hébergés sur les serveurs de Bribes avec les directives d'installation.
Les packages sont des fichiers tar.gz et les directives d'installation sont des fichiers « ppd »
Ci-dessous, l'exemple de TK qui permet de faire des fenêtres :

Image non disponible

Il suffit de télécharger par ailleurs un des packages et le fichier ppd associé, les copier dans un répertoire et d'exécuter PPM en mode commande comme suit : ppm install nom_du_module.ppd.

Dans l'exemple ci-dessous, j'ai téléchargé le package 804.030 de Tk pour la version 516 de Perl.

Image non disponible

Astuce bonus : pour connaître la version de Perl, il suffit de taper 'perl-v' dans une fenêtre de commande.

PPM décompacte et installe les fichiers. On peut alors se rendre dans Perl Package Manager pour constater que le module est installé. Sur la copie d'écran un peu plus haut, on voit que Tk est bien installé (en mode "site" puisqu'il ne faisait pas partie de l'installation initiale).

Ce qui m'a causé le plus de problèmes est le fait que les packages pour 32 et 64 bits ne sont pas au même endroit. Ce n'est pas anormal, bien au contraire, mais je suis tombé sur un tutoriel Tk qui ne parlait pas du 64 bits (il datait un peu) et que l'erreur générée n'est pas très parlante

 
Sélectionnez
can't load Event.dll for module Tk::Event:

Je me suis trouvé un peu coincé avec l'URL de download de Bribes, mais en remontant dans le site j'ai vu qu'il y avait DEUX repositories :

Attention, les fichiers ppd ne sont pas compatibles.

En compilant avec la bonne version, fini les erreurs "can't load dll for module".

C'était ma dernière astuce. J'espère que ça rendra service au plus grand nombre d'aficionados de Perl. Si ça vous a plu, faites-le-moi savoir ; on pourra partager les expressions régulières les plus… savoureuses.

III. Bonus

Un petit exemple d'exécution de Tk. Il permet de choisir un fichier et d'exécuter une procédure dessus.

Ça donne ça

Image non disponible

et le code est celui-ci :

 
Sélectionnez
#!/usr/bin/perl
use warnings;
use strict;
use Tk;
use Tk::FileSelect;
my $txt = "c est parti";
my $i   = 1;
my $filename;

# initialisation de la fenetre principale
my $msg = MainWindow->new;
$msg->geometry("500x350+0+0");
$msg->title("Traitement des fichiers");

# message
my $b_label = $msg->Message(
  -text    => "Appuyez sur 'Fichier' pour en choisir le fichier à traiter\nou 'Fin' pour sortir\n",
  -width   => 450,
  -justify => 'left',
)->pack;

# boutons
my $b1 = $msg->Button(
  -text    => "Fin",
  -command => sub {exit;}
)->pack( -side => 'left', -expand => 1 );
my $b2 = $msg->Button(
  -text    => "Continuer",
  -state   => 'disabled',
  -command => \&traitement
)->pack( -side => 'right', -expand => 1 );
my $b3 = $msg->Button(
  -text    => "Fichier",
  -command => \&fichier
)->pack( -side => 'right', -expand => 1 );

# go
MainLoop;

sub fichier {
  my $types = [ 
      [ 'Fichiers log', '.log' ],
      ['Tous les fichiers',    '*']
  ];

  # fenetre de choix d un fichier
  $filename = $msg->getOpenFile(
    -filetypes  => $types,
    -initialdir => "."
  );
  if ( defined $filename and $filename ne '' ) {
    $txt
      = "Vous avez choisi $filename\n\nAppuyez sur 'Continuer' pour le traiter\nou 'Fichier' pour en changer\n";
    $b_label->configure( -text => $txt );
    $b_label->update;

    # on a un fichier, on active le bouton continuer
    $b2->configure( -state => 'active' );
    $b2->update;
  }
}

sub traitement {
  print "traitement de $filename ok\n";

  # traitement en cours, on desactive le bouton Fichier
  $b3->configure( -state => 'disabled' );
  $b2->update;
  $txt = "Traitement de $filename\n\netape $i";
  $b_label->configure( -text => $txt );
  $b_label->update;
  $i++;
}

Si vous êtes arrivé jusque-là, merci de votre attention. Vous l'avez certainement compris, j'attends vos commentaires, vos notes, vos +1 (ça fait très plaisir) et tout ce qui peut nourrir le dialogue. Car seul le dialogue peut rendre ce type d'espace humain. Cependant, n'hésitez pas à jeter un œil aux autres sujets de mon blog. J'espère qu'ils vous intéresseront tout autant et pour vous tenir au courant des nouveaux abonnez-vous à mon compte Twitter ou à mes flux RSS.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Phil K. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.