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 :

[Perl/tk] propiété textVariable de l'élément entry


Sujet :

Interfaces Graphiques Perl

  1. #1
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut [Perl/tk] propiété textVariable de l'élément entry
    Bonjour,

    Dans une boucle je génère dynamiquement des zones de saise de la maniere suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $zone_saisie_repertoire[$i] = $cadre[$i] -> Entry ( -textvariable => \$nom_repertoire, -width=>50 ) ;
    .

    Jusque là tout va bien!
    Le problème est que je voudrais affecter un élément de tableau à la propriété textVariable, comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $zone_saisie_repertoire[$i] = $cadre[$i] -> Entry ( -textvariable => \$nom_repertoire[$i], -width=>50 ) ;
    Mais ça ne fonctionne pas . Le contenude la zone de saisie n'est pas le reflet de $nom_repertoire[$i] . J'ai essayé avec \$nom_repertoire[\$i] mais c'est pareil.

    Avez-vous une idée ?

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu devrais essayer avec \{$nom_repertoire[$i]} et je te rapelle que ça ne marchera que si tu modifies chaque élément du tableau @nom_repertoire atomiquement, c'est à dire sans affectation globale à @nom_repertoire, sinon ta référence ne pointera plus vers le $ième élément de @nom_repertoire, mais vers l'ancienne valeur à cet index.

    --
    Jedaï

  3. #3
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Merci de ta réponse, mais ça ne fait pas ce que je veux !!

    En fait je pense que mon problème en plus compliqué que ça.

    Je vais essayer d'être clair.
    Dans un premier temps j'ai ecris le code suivant qui génere une entryBox et un bouton qui permet de selectionner un repertoire. Quand le repertoire est selectoionné son nom s'affiche dans l'entryBox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $zone_saisie_repertoire = $cadre -> Entry ( -textvariable => \$nom_repertoire, -width=>50 ) ;
    $bouton_repertoire = $cadre-> Button ( -text =>$bouton_label_repertoire ,
                                                    -command => sub {
                            $nom_repertoire = $fenetre -> chooseDirectory ( -initialdir => "c:\\") ;  # sous Windows
     
                ) ;
    Ce code fonctionne

    Maitenant je voudrais pouvoir creer X fois ces élements (le bouton et l'entry) dynamiquement, à partir d'infos contenues dans un fichier text.
    J'ai donc remplacé mes variables scalaire par des tableaux et fait une boucle de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (my $i:=0 ; $i <= 4 ; $i++) {
    $zone_saisie_repertoire[$i] = $cadre -> Entry ( -textvariable => \$nom_repertoire, -width=>50 ) ;
    $bouton_repertoire[$i] = $cadre-> Button ( -text =>$bouton_label_repertoire[$i] ,
                                                    -command => sub {
                            $nom_repertoire[$i] = $fenetre -> chooseDirectory ( -initialdir => "c:\\") ;  # sous Windows
     
                ) ;
    }
    Ce code génère bien mes éléments graphiques mais je n'arrive par récupérer le répertoire qui a été sélectionné.

    Si vous avez une idée ?

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu te trompes, et j'ai parfaitement raison !!
    Comme le prouve ce petit exemple, ma théorie est parfaite :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use Tk;
     
    my $mw = MainWindow->new( -title => 'Essai manip références !');
     
    my @tab = (1, 2);
    my $ent1 = $mw -> Entry ( -textvariable => \$tab[0], -width=>50 ) ;
    my $ent2 = $mw -> Entry ( -textvariable => \$tab[1], -width=>50 ) ;
    my $but1 = $mw -> Button ( -text => "incrémente 1" ,
                                 -command => sub { $tab[0] += 1; }) ;
    my $but2 = $mw -> Button ( -text => "incrémente 2" ,
                                 -command => sub { $tab[1] += 1; }) ;
     
    $ent1->pack(); $ent2->pack(); $but1->pack(); $but2->pack();
     
    MainLoop();
    J'hasarderais une suggestion : initialise ton tableau @nom_repertoire avant de créer les "Entry" ! Et tu verras que tout marche sans accroc.

    --
    Jedaï

  5. #5
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par Jedai
    Tu te trompes, et j'ai parfaitement raison !!
    Je n'en doute pas une secande !!
    Je n'ai pas le temps d'essayer ton code maintenant je le ferai Lundi (hé oui je suis en WE ..)
    Encore merci de ton aide.

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par planetevoyage
    Citation Envoyé par Jedai
    Tu te trompes, et j'ai parfaitement raison !!
    Je n'en doute pas une secande !!
    Je n'ai pas le temps d'essayer ton code maintenant je le ferai Lundi (hé oui je suis en WE ..)
    Encore merci de ton aide.
    C'était juste en réponse au "mon problème est plus compliqué que ça" en gras

    Et ne t'inquiète pas, mon code fonctionne parfaitement et dans les deux sens, je te garantis donc la réponse à 100%. (ce que je ne fais jamais sans avoir testé)

    --
    Jedaï

  7. #7
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Effectivement ta soultion fonctionne... mais ce n'est pas exactement ce que je veux faire !!.
    Si, dans ton exemple je remplace les 4 lignes de code qui crééent les "entry" et le button comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for (my $i = 1 ; $i<=2 ; $i++) {
       $ent[$i] = $mw -> Entry ( -textvariable => \$tab[$i], -width=>50 ) ;
     
       $but[$i] = $mw -> Button ( -text => "incrémente 1" ,
                                 -command => sub { $tab[$i] += 1; }) ;
     
     
    $ent[$i]->pack(); $but[$i]->pack();
    }
    Alors l'incrémentation ne fonctionne pas.

    Et il faut bien que je passe par une boucle for car je ne sais pas combien d'éléments j'ai a creer (ce nombre depend d'un fichier de config)

    C'est bien embêtant tout ça !!
    Si tu as une idée n'hésite pas

  8. #8
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Le code suivant marche parfaitement chez moi...
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use Tk;
     
    my $NB_BUTTON = 5;
    my $mw = MainWindow->new( -title => 'Essai manip références !');
     
    my(@ent, @but);
    my @tab = (1..$NB_BUTTON);
    foreach my $num (0..($NB_BUTTON-1)){
      $ent[$num] = $mw -> Entry ( -textvariable => \$tab[$num], -width=>50 ) ;
      $but[$num] = $mw -> Button ( -text => "incrémente ".($num + 1) ,
                                   -command => sub { $tab[$num] += 1; }) ;
     
      $ent[$num]->pack(); $but[$num]->pack();
    }
     
    MainLoop();
    Teste-le et dis moi s'il marche ou pas chez toi. S'il ne marche pas, on avisera.

    --
    Jedaï

  9. #9
    En attente de confirmation mail
    Inscrit en
    Février 2003
    Messages
    40
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 40
    Points : 39
    Points
    39
    Par défaut
    1/ Merci de ta réponse
    2/ Ton code fonctionne parfaitement
    3/ Pourquoi la boucle avec foreach fonctionne et pas celle avec for ?

    Encore merci.

  10. #10
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Ah ! Les mystères des closures....

    Foreach aliase sa variable à chacun des éléments du tableau tour à tour... Imagine que foreach my $bidule ( @machin ) { ... } signifie un truc comme : { my $bidule := $machin[0] ... } { my $bidule := $machin[1] ... } etc... Si tu as déjà utilisé les closures en Perl, tu comprendras pourquoi ça marche.

    Mais tu peux le faire avec for, le seul problème est que for (my $bidule = truc ; ... ; ... ){}
    crée plutôt une sorte de : {my $bidule = truc; for( ; ... ; ... ){ } }, du coup toutes les closures (sub {}) créées à l'intérieur sont créées avec le même $bidule (je veux dire avec la même variable. Si tu veux passer au-dessus de ça, il faut créer une variable lexicale "$bidule2" à l'intérieur du bloc du for, qui elle sera bien différente à chaque itération (je veux dire qu'il y aura autant de variable "$bidule2" qu'il y aura d'itération). Application :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use Tk;
     
    my $NB_BUTTON = 5;
    my $mw = MainWindow->new( -title => 'Essai manip références !');
     
    my(@ent, @but);
    my @tab = (1..$NB_BUTTON);
     
    for( my $num = 0 ; $num < $NB_BUTTON; $num++ ){
      my $num_int = $num;
      $ent[$num] = $mw -> Entry ( -textvariable => \$tab[$num], -width=>50 ) ;
      $but[$num] = $mw -> Button ( -text => "incrémente ".($num + 1) ,
                                   -command => sub { $tab[$num_int] += 1; }) ;
     
      $ent[$num]->pack(); $but[$num]->pack();
    }
     
     
    MainLoop();
    Comme tu le constateras, ce code marche parfaitement !

    Une façon peut-être un peu plus propre de procéder consistera peut-être à créer une fonction qui te fabriquera les closures à la demande :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use Tk;
     
    my $NB_BUTTON = 5;
    my $mw = MainWindow->new( -title => 'Essai manip références !');
     
    my(@ent, @but);
    my @tab = (1..$NB_BUTTON);
     
    for( my $num = 0 ; $num < $NB_BUTTON; $num++ ){
      $ent[$num] = $mw -> Entry ( -textvariable => \$tab[$num], -width=>50 ) ;
      $but[$num] = $mw -> Button ( -text => "incrémente ".($num + 1) ,
                                   -command => create_incr($num) ) ;
     
      $ent[$num]->pack(); $but[$num]->pack();
    }
     
     
    MainLoop();
     
    sub create_incr {
      {
       my $num = shift;
       return sub { $tab[$num] += 1; }
      }
    }
    Ou même, et finalement c'est le plus simple, tu ne crées pas du tout de closures, et tu t'en remets tout simplement à une seule fonction qui prend en paramètre l'index de l'élément à augmenter (qui là est évalué directement, plus de problème d'évaluation différée) :
    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
     
    #! /usr/bin/perl
    use strict;
    use warnings;
     
    use Tk;
     
    my $NB_BUTTON = 5;
    my $mw = MainWindow->new( -title => 'Essai manip références !');
     
    my(@ent, @but);
    my @tab = (1..$NB_BUTTON);
     
    for( my $num = 0 ; $num < $NB_BUTTON; $num++ ){
      $ent[$num] = $mw -> Entry ( -textvariable => \$tab[$num], -width=>50 ) ;
      $but[$num] = $mw -> Button ( -text => "incrémente ".($num + 1) ,
                                   -command => [ \&incr, $num ]) ;
     
      $ent[$num]->pack(); $but[$num]->pack();
    }
     
     
    MainLoop();
     
    sub incr {
      my $num = shift;
      $tab[$num] += 1;
    }
    Je te recommande plutôt la troisième solution, si les deux autres te confondent...

    --
    Jedaï

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

Discussions similaires

  1. Erreur "Duplicate entry" pour un élément non-clé
    Par gwendal86 dans le forum Hibernate
    Réponses: 1
    Dernier message: 02/10/2008, 14h05
  2. [pERl TK] Obtenir le texte sélectionné d'un widget entry
    Par dreydrey dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 18/01/2007, 09h18
  3. [Perl/tk]affichage simultané Entry/Label
    Par VinnieMc dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 07/11/2006, 22h32
  4. [Perl/Tk] widget Entry ou équivalent ?
    Par Mr6 dans le forum Interfaces Graphiques
    Réponses: 2
    Dernier message: 13/04/2006, 07h34
  5. Methode Entry avec Perl/Tk
    Par strach dans le forum Interfaces Graphiques
    Réponses: 5
    Dernier message: 21/08/2005, 15h34

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