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

Interfaces Graphiques Perl Discussion :

Problème accent avec un getOpenFile


Sujet :

Interfaces Graphiques Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut Problème accent avec un getOpenFile
    Bonjour à tous,

    J'ai créé un script qui permet de récupérer un fichier via un getOpenFile afin de faire des vérification. Dès que j'ai un caractère accentué dans le chemin, le script m'affiche l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tk::Error: Le fichier C:/temp/caractere_accentu├â┬â├é┬®e.xml n'existe pas ! at Verif_Coherence_AM.pl line 94.
    Voici le code du script :
    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
     
    ## MODULES
    use strict;
    use warnings;
    use Cwd; 
    use Tk; #Interface Graphique
     
    ## VARIABLES
        # Scalaires
        my $localpath = cwd();
        my $am_path;
        my $file_amont = "../res/Exigences_Amont.txt";
        my $data;
     
        # Tableaux
     
        # Widgets
        my $frame;
        my $etat;
        my $label;
        my $addr_am_prev;
        my $result;
        my $resultats;
        my $widget_texte;
        my $top;
        my $top_texte;
     
    ## SOUS-PROGRAMMES
    sub SauveFichier {
     
     # Description : Permet de sauvegarder le fichier des exigences amont.
        open FILE_AMONT,">".$file_amont or die "Le fichier $file_amont n'existe pas !";
        $data = $top_texte -> get ('1.0','end');
        print FILE_AMONT $data;
        close FILE_AMONT;
     
        $top -> destroy;
        $frame->deiconify();
        $frame->raise();
        $frame->focus();
     
        open FILE_AM, "<".$addr_am_prev or die "Le fichier $addr_am_prev n'existe pas !";
          Traitements;
        close FILE_AM;
      return;
    }
     
    sub AfficheTopLevel {
        #  Création du TopLevel
        $top = $frame -> Toplevel (-title => 'Exigences Amonts',-width => 600, -height => 600);
     
        # On crée le widget acceuillant les résultats
        $label = $top->Label(-text => 'Veuillez entrer les exigences amonts')->place(-x => 0, -y => 0, -width => 600, -height => 20);
        $top_texte = $top->Text()->place(-x => 0, -y => 30, -width => 600, -height => 520);
     
        # On crée le bouton.
        $top -> Button(-text => 'OK',-command => sub {SauveFichier}) ->place(-x => 250, -y => 570, -width => 100, -height => 30);
     
        return;
    }
     
    sub SelectFile {
     # Description : Fonction de sélection d'un fichier
     
        # Récupération du fichier (.xml files)
        my @types = ( [ "Data Files", '.xml', 'TEXT' ], [ "All Files", "*" ] );
        $addr_am_prev = $frame->getOpenFile(
        -initialdir => $ENV{AppliConfig}->{DefaultDirectory},
        -multiple   => 0,
        -filetypes  => \@types,);
     
        AfficheTopLevel;
      return;
    }
     
    ## PROGRAMME PRINCIPAL
    ####  Création du TopLevel
    $frame = MainWindow->new(-title => 'Verif_Coherence_AM_PREV');
    $frame -> minsize('900','600'); 
     
    # On crée le widget acceuillant les résultats
    $widget_texte = $frame->Text();
    $widget_texte->place(-x => 0, -y => 0, -width => 900, -height => 540);
     
    #### On crée les deux boutons.
    $frame -> Button(-text => 'Ouvrir',-command => sub {SelectFile}) ->place(-x => 100, -y => 550, -width => 200, -height => 30);
    $frame -> Button(-text => 'Quitter',-command => sub {exit 0;}) ->place(-x => 600, -y => 550, -width => 200, -height => 30);
     
    # On centre la fenêtre
    CentrerWidget($frame);
     
    MainLoop;
    La variable $addr_am_prev dans le sous-programme SelectFile doit pouvoir contenir des caractères accentués, or cela ne fonctionne pas.

    J'ai fait des tests avec le module Encode mais je n'ai eu aucun résultat concluant.

    Merci d'avance pour l'aide que vous m'apporterez

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Pour régler ce souci, ton programme doit :
    - Etre en utf8
    - Rajoute - Rajoute - Dans ta procédure selectfile, utilise encode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $addr_am_prev = encode('utf8', $addr_am_prev);

  3. #3
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Merci pour ta réponse rapide

    Mais ça ne fonctionne pas, il m'affiche toujours la même erreur

    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
     
    use utf8;
    use Encode;
     
    sub SelectFile {
     # Description : Fonction de sélection d'un fichier
     
        # Récupération du fichier (.xml files)
        my @types = ( [ "Data Files", '.xml', 'TEXT' ], [ "All Files", "*" ] );
        $addr_am_prev = $frame->getOpenFile(
        -initialdir => $ENV{AppliConfig}->{DefaultDirectory},
        -multiple   => 0,
        -filetypes  => \@types,);
     
        $addr_am_prev = encode('utf8', $addr_am_prev);
        AfficheTopLevel;
      return;
    }

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Voici un code qui fonctionne :
    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
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Tk;
    use Cwd;
    use utf8;
    use Encode;
     
    ## VARIABLES
    # Scalaires
    my $localpath = cwd();
    my $am_path;
    my $file_amont = "../res/Exigences_Amont.txt";
    my $data;
     
    # Tableaux
     
    # Widgets
    my $frame;
    my $etat;
    my $label;
    my $addr_am_prev;
    my $result;
    my $resultats;
    my $widget_texte;
    my $top;
    my $top_texte;
     
    ## SOUS-PROGRAMMES
    sub SauveFichier {
     
      # Description : Permet de sauvegarder le fichier des exigences amont.
      open FILE_AMONT, ">" . $file_amont or die "Le fichier $file_amont n'existe pas !";
      $data = $top_texte->get( '1.0', 'end' );
      print FILE_AMONT $data;
      close FILE_AMONT;
     
      $top->destroy;
      $frame->deiconify();
      $frame->raise();
      $frame->focus();
     
      open FILE_AM, '<', $addr_am_prev or die "Le fichier $addr_am_prev n'existe pas !";
     
      #  Traitements;
      close FILE_AM;
     
      return;
    }
     
    sub AfficheTopLevel {
     
      #  Création du TopLevel
      $top = $frame->Toplevel(
        -title  => 'Exigences Amonts',
        -width  => 600,
        -height => 600
      );
     
      # On crée le widget acceuillant les résultats
      $label = $top->Label( -text => 'Veuillez entrer les exigences amonts', )->place(
        -x      => 0,
        -y      => 0,
        -width  => 600,
        -height => 20
      );
      $top_texte = $top->Text()->place( -x => 0, -y => 30, -width => 600, -height => 520 );
     
      # On crée le bouton.
      $top->Button(
        -text    => 'OK',
        -command => \&SauveFichier,
      )->place( -x => 250, -y => 570, -width => 100, -height => 30 );
     
      return;
    }
     
    sub SelectFile {
     
      # Description : Fonction de sélection d'un fichier
     
      # Récupération du fichier (.xml files)
      my @types = ( [ "Data Files", '.xml', 'TEXT' ], [ "All Files", "*" ] );
      $addr_am_prev = $frame->getOpenFile(
        -initialdir => $ENV{AppliConfig}->{DefaultDirectory},
        -multiple   => 0,
        -filetypes  => \@types,
      );
     
      # Gestion des caractères spéciaux
      if ( $^O =~ m{mswin32}i ) {
        $addr_am_prev = encode( 'iso-8859-1', $addr_am_prev );
      }
     
      AfficheTopLevel();
      return;
    }
     
    ## PROGRAMME PRINCIPAL
    ####  Création du TopLevel
    $frame = MainWindow->new( -title => 'Verif_Coherence_AM_PREV' );
    $frame->minsize( '900', '600' );
     
    # On crée le widget acceuillant les résultats
    $widget_texte = $frame->Text();
    $widget_texte->place( -x => 0, -y => 0, -width => 900, -height => 540 );
     
    #### On crée les deux boutons.
    $frame->Button(
      -text    => 'Ouvrir',
      -command => \&SelectFile
    )->place( -x => 100, -y => 550, -width => 200, -height => 30 );
    $frame->Button(
      -text    => 'Quitter',
      -command => sub { exit 0; }
    )->place( -x => 600, -y => 550, -width => 200, -height => 30 );
     
    # On centre la fenêtre
    CentrerWidget($frame);
     
    MainLoop;
     
    sub CentrerWidget {
      unless ( scalar(@_) == 1 ) {
        die('Usage : CentrerWidget( $MainWidget );');
      }
      my ($Widget) = @_;
     
      # Height and width of the screen
      my $LargeurEcran = $Widget->screenwidth();
      my $HauteurEcran = $Widget->screenheight();
     
      # update le widget pour recuperer les vraies dimensions
      $Widget->update;
      my $LargeurWidget = $Widget->width;
      my $HauteurWidget = $Widget->height;
     
      # On centre le widget en fonction de la taille de l'ecran
      my $NouvelleLargeur = int( ( $LargeurEcran - $LargeurWidget ) / 2 );
      my $NouvelleHauteur = int( ( $HauteurEcran - $HauteurWidget ) / 2 );
      $Widget->geometry( $LargeurWidget . "x" . $HauteurWidget . "+$NouvelleLargeur+$NouvelleHauteur" );
     
      $Widget->update;
     
      return;
    }
    Quelques remarques :
    1. Essaye la prochaine fois de proposer un programme qui fonctionne ou plutôt qui nous permet de voir l'erreur. Sinon en Tk, il est difficile pour nous de reproduire l'erreur.
    2. Apprends à bien indenter ton code. Sous Tk, une mauvaise indentation est vraiment illisible.
    3. Utilise l'option -command comme dans mon programme avec des appels des programmes de la sorte
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      -command => \&MaProcedure
      ou avec arguments :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      -command => [\&MaProcedure, Mes arguments, ...]
      .
    4. Pour ton souci, le bon code était plutôt le suivant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
        # Gestion des caractères spéciaux
        if ( $^O =~ m{mswin32}i ) {
          $addr_am_prev = encode( 'iso-8859-1', $addr_am_prev );
        }
    5. Je recommande toujours d'avoir tes programmes en utf8. Et en Tk, de rajouter

  5. #5
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    Nickel ça fonctionne merci .

    La prochaine fois je ferai plus attention à mon code

    @++

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    un petit tag résolu

  7. #7
    Membre averti Avatar de philouelgeek
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 60
    Par défaut
    C'est fait. J'avais du cliquer deux fois sur le TAG

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

Discussions similaires

  1. problème accent avec php 5.3.1
    Par PAYASS59 dans le forum Langage
    Réponses: 2
    Dernier message: 26/01/2010, 14h25
  2. Réponses: 1
    Dernier message: 21/01/2010, 14h20
  3. Problème accent avec MySQL
    Par fangri dans le forum JDBC
    Réponses: 1
    Dernier message: 15/01/2010, 14h40
  4. [C#] Problème accents avec HttpWebRequest
    Par aucean dans le forum C#
    Réponses: 2
    Dernier message: 03/12/2005, 14h40

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