IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Pb d'affichage avec couleurs


Sujet :

Langage Perl

  1. #1
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut Pb d'affichage avec couleurs
    Bonjour ,

    Ci après mon code qui me permet de "fabriquer" mes tableaux pour un affichage à l'écran de données , décomposé en plusieurs fonctions.

    Hors mon problème est que le fait d'appliquer une couleur à une chaine de caractères , modifie aussi sa longueur , ce qui est gênant dans mon affichage.

    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
    sub color {
        $couleur = @_[0];
        $texte = @_[1];
        %def_couleur = (
            rouge         => 31,
            vert          => 32,
            jaune         => 33,
            bleu          => 34,
            violet        => 35,
            turquoise     => 36,
            gris          => 37,
            rouge_inv     => 41,
            vert_inv      => 42,
            jaune_inv     => 43,
            bleu_inv      => 44,
            violet_inv    => 45,
            turquoise_inv => 46,
            gris_inv      => 47,
        );
        $texte_couleur = "\033[".$def_couleur{$couleur}."m".$texte."\033[m";
        return "$texte_couleur";
    }
     
    sub tableau {
        $taille = @_[0];
        $texte = @_[1];
        $taille = $taille-2;
        if ( $texte eq "-" ) {
            $ligne = "+"."-"x$taille."+\n";
        }
        else {
            $ligne ="| ".$texte." |\n";
        }
        return $ligne ;
    }
     
    sub centre {
        $taille = @_[0];
        $texte = @_[1];
        $long = $taille - length ($texte) -4;
        $demi = int($long/2);
        $reste = $long%2;
        $texte = " "x$demi.$texte." "x$demi." "x$reste;
        return $texte;
    }
     
    sub gauche {
        $taille = @_[0];
        $texte = @_[1];
        $long = $taille - length ($texte) -4;
        $texte = $texte." "x$long;
        return $texte;
    }
     
    sub droite {
        $taille = @_[0];
        $texte = @_[1];
        $long = $taille - length ($texte) -4;
        $texte = " "x$long.$texte;
        return $texte;
    }
     
     
    $t = 80;
    print tableau ($t,"-");
    print tableau ($t,gauche($t,"Essai de tableau"));
    print tableau ($t,droite($t,"Essai de tableau"));
    print tableau ($t,centre($t,color(vert_inv,"Essai de tableau")));
    print tableau ($t,"-");
     
    $texte1 = color(vert_inv,"Essai de tableau");
    $texte2 = "Essai de tableau";
     
    $l1 = length ($texte1);
    $l2 = length ($texte2);
     
    print "$l1 - $l2";
    donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +------------------------------------------------------------------------------+
    | Essai de tableau                                                             |
    |                                                             Essai de tableau |
    |                          Essai de tableau                            |
    +------------------------------------------------------------------------------+
    25 - 16
    Existe t-il une solution à mon pb ?
    Merci pour votre aide

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Pour le calcul de la longueur du texte, il ne faut pas prendre en compte les caractères qui permettent la mise en couleur.

    Je me suis permis de corriger ton code car j'avais énormément de warnings :
    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
    #!/usr/bin/perl -w
     
    use strict;
     
    my $t = 80;
    print tableau($t,"-");
    print tableau($t,gauche($t,"Essai de tableau"));
    print tableau($t,droite($t,"Essai de tableau"));
    print tableau($t,centre($t,color('vert_inv',"Essai de tableau")));
    print tableau($t,"-");
     
    my $texte1 = color('vert_inv',"Essai de tableau");
    my $texte2 = "Essai de tableau";
     
    my $l1 = length ($texte1);
    my $l2 = length ($texte2);
     
    print "$l1 - $l2\n";
    #print "Calcul longueur :: ".calculLongueurTexte($texte1);
     
    sub color {
        my $couleur = $_[0];
        my $texte = $_[1];
        my %def_couleur = (
            rouge         => 31,
            vert          => 32,
            jaune         => 33,
            bleu          => 34,
            violet        => 35,
            turquoise     => 36,
            gris          => 37,
            rouge_inv     => 41,
            vert_inv      => 42,
            jaune_inv     => 43,
            bleu_inv      => 44,
            violet_inv    => 45,
            turquoise_inv => 46,
            gris_inv      => 47,
        );
        my $texte_couleur = "\033[".$def_couleur{$couleur}."m".$texte."\033[m";
        return "$texte_couleur";
    }
     
    sub tableau {
        my $taille = $_[0];
        my $texte = $_[1];
        $taille = $taille-2;
        my $ligne;
        if ( $texte eq "-" ) {
            $ligne = "+"."-"x$taille."+\n";
        }
        else {
            $ligne ="| ".$texte." |\n";
        }
        return $ligne ;
    }
     
    sub centre {
        my $taille = $_[0];
        my $texte = $_[1];
        #my $long = $taille - length ($texte) -4;
        my $long = $taille - calculLongueurTexte($texte) - 4;
        my $demi = int($long/2);
        my $reste = $long%2;
        $texte = " "x$demi.$texte." "x$demi." "x$reste;
        return $texte;
    }
     
    sub gauche {
        my $taille = $_[0];
        my $texte = $_[1];
        #my $long = $taille - length ($texte) -4;
        my $long = $taille - calculLongueurTexte($texte) - 4;
        $texte = $texte." "x$long;
        return $texte;
    }
     
    sub droite {
        my $taille = $_[0];
        my $texte = $_[1];
     
        #my $long = $taille - length ($texte) -4;
        my $long = $taille - calculLongueurTexte($texte) - 4;
        $texte = " "x$long.$texte;
        return $texte;
    }
     
    sub calculLongueurTexte{
    	my $texte = $_[0];
     
    	$texte =~ s/\033\[\d{2}m//;
    	$texte =~ s/\033\[m//;
    	return length( $texte );
    }
    Dans ce code, plutôt qu'appeler la fonction 'length', j'appelle la fonction 'calculLongueurTexte' décrite à la fin qui supprime les caractères en trop puis renvoie la longueur de la chaine.

  3. #3
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    MErci merci,

    J'étais aussi parti dans les expressions régulières mais ça ne marchait pas , bêtement je ne soustrayais pas le \033 .

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    D'abord, pour la gestion des textes colorés à afficher dans un terminal, tu disposes des modules : Term::ANSIColor et Term::ANSIColor::Simple (au moins).
    Ensuite, en utilisant Term::ANSIColor, même avec ta propre fonction de colorisation (mais que tu devrais pouvoir remplacer par celle de Term::ANSIColor), tu peux "décolorer" du texte, ce qui te permet dans mesurer convenablement la taille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    length(colorstrip($texte))
    Par ailleurs, selon l'encodage de ton texte, il peut arriver, notamment pour les caractères accentués de l'alphabet ISO-8859-1, qu'un symbole soit codé sur plusieurs octets, entrainant le décompte par length de plusieurs caractères. Pour bien décompter les caractères, il faut alors décoder avant de mesurer. Ainsi, si ton texte est en UTF8, il faudrait faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ perl -E 'use Encode; say length(decode("utf8", "été"))'
    3
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  5. #5
    Membre actif Avatar de olivier1969
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    Novembre 2013
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 151
    Points : 208
    Points
    208
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    D'abord, pour la gestion des textes colorés à afficher dans un terminal, tu disposes des modules : Term::ANSIColor et Term::ANSIColor::Simple (au moins).
    Ensuite, en utilisant Term::ANSIColor, même avec ta propre fonction de colorisation (mais que tu devrais pouvoir remplacer par celle de Term::ANSIColor), tu peux "décolorer" du texte, ce qui te permet dans mesurer convenablement la taille :
    Merci mais je ne peux installer de modules supplémentaires !

  6. #6
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Es-tu bien sûr que l'un au moins de ces modules n'est pas déjà installé?

    Je pense que Term::ANSIColor est un module standard et qu'il est sans doute déjà installé.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Bien vu Lolo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ corelist Term::ANSIColor
     
    Data for 2017-01-14
    Term::ANSIColor was first released with perl v5.6.0
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script d'affichage avec couleur
    Par G3G3 dans le forum Général Python
    Réponses: 2
    Dernier message: 23/07/2009, 18h57
  2. GDI+ et affichage d'image avec couleurs transparentes
    Par le petit dernier dans le forum MFC
    Réponses: 4
    Dernier message: 06/03/2009, 15h08
  3. affichage avec les couleurs
    Par dev0712 dans le forum Débuter
    Réponses: 3
    Dernier message: 02/01/2009, 10h56
  4. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  5. Problème d'affichage avec trace
    Par WriteLN dans le forum Flash
    Réponses: 10
    Dernier message: 22/10/2003, 16h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo