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] Liste déroulante


Sujet :

Interfaces Graphiques Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Points : 39
    Points
    39
    Par défaut [Perl/Tk] Liste déroulante
    Bonjour,

    Voila 2 jours que je recherche sous google comment faire une liste déroulante en contexte tk, tous ce que j'ai trouvé n'est pas équivalent a la liste déroulante que l'on peu trouver sur le net, ou la combo-box en java.

    Je suppose que c'est possible de réaliser ça en Perl/Tk, si oui comment?

    Merci d'avance a tous

  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
    Voici la première entrée que me renvoie google après une recherche sur "Perl Tk Combobox"....
    http://www.developpez.net/forums/sho...d.php?t=307162

    --
    Jedaï

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Points : 39
    Points
    39
    Par défaut
    Bonjour,

    Merci de cette réponse, je n'avais en effet pas chercher combo box...

    Par contre j'ai un peu testé voir comment ça marchais mais j'aimerais faire un truc et je ne vois pas comment.

    J'ai un champs de texte et une combo box juste aprés. Le champs de texte doit acceuillir un motif, et la combo box contient une liste toute prête de motif (pour les motifs les plus courant). Mais si je séléctionne un motif dans la combo il faudrait que sa séquence s'affiche dans le champs de texte. Par exemple "Myb3" serait lié a "ayyytgrsacgt".

    Hors dans la definition d'une liste on ne donne qu'un nom et c'est ce nom qui a être contenue dans la variable associée a la liste. J'aimerais donner un nom et que la variable contienne une valeur associé a ce nom et pas le nom que l'utilisateur vois.

    Je ne sais pas si j'ai été assez clair ou pas

  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
    Je comprend ce que tu veux dire, mais je ne crois pas que ce soit possible... A priori la variable associée à une browseEntry contient exactement le texte du choix sélectionné, rien d'autre.
    Par contre tu peux tout de même obtenir l'effet que tu veux, en changeant la browsecmd :
    -browsecmd

    Specifies a function to call when a selection is made in the popped up listbox. It is passed the widget and the text of the entry selected. This function is called after the entry variable has been assigned the value.
    Tu peux facilement mettre là une fonction qui met à jour le texte de ton champs non par la variable, mais par le motif associé. Cela te conviendrait-il ?

    --
    Jedaï

  5. #5
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Points : 39
    Points
    39
    Par défaut
    Oui en effet c'est ce qui seras le mieux si d'autre methode sons pas possible! Donc ce que j'ai a faire c'est créer une fonction qui lie le nom est la valeurs et je l'appelle grâce a cette commande dans la definition de la liste.

    Bon ben ça m'a l'air simple tout ça! Je vais voir ce que je peu faire!

    Merci encore!

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Points : 39
    Points
    39
    Par défaut
    Bon en fait c'est pas tout a fait réslue :/

    Voi ce que j'ai :
    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
     
    my %pattern = {
    PK => "KATATGKCCRTYTTCTCKMAC",
    NBS5A => "YYTKRTHGTMITKGATGAYGTITGG",
    Myb3 => "ACVGAYAAYGARATCAARAAYYWYTGG"};
     
    ...
     
    my $txt_pattern = $t_send_adjustement -> Entry ( -textvariable => \$val_pattern) ;
    	$t_send_adjustement -> put (0, 1, $txt_pattern);
     
    ...
     
    my $be_pattern = $t_send_adjustement -> BrowseEntry( -variable  => \$val_nom_pattern,
     -browsecmd => \&pattern_linker(\$val_pattern, \$val_nom_pattern, \%pattern) );
     
    $be_pattern ->insert("end", "Myb3");
    $be_pattern ->insert("end", "PK");
    $be_pattern ->insert("end", "NBS5A");
     
    $t_send_adjustement -> put (0,3, $be_pattern);
    et dans le fichier de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub pattern_linker($$) {
    	my ($val, $pattern, %hash) = @_ ;
    	$val = $hash -> {$pattern};
    }
    Et lorsque je selectionne une valuer dans ma combo box, le programme plante avec cette erreur :
    j'imagine bien que mon code ne tient pas la route, mais je vois pas ou a vrai dire...

  7. #7
    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 Mayeu
    Bon en fait c'est pas tout a fait réslue :/

    Voi ce que j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    my %pattern = {
    PK => "KATATGKCCRTYTTCTCKMAC",
    NBS5A => "YYTKRTHGTMITKGATGAYGTITGG",
    Myb3 => "ACVGAYAAYGARATCAARAAYYWYTGG"};
     
    ...
     
    my $txt_pattern = $t_send_adjustement -> Entry ( -textvariable => \$val_pattern) ;
    $t_send_adjustement -> put (0, 1, $txt_pattern);
     
    ...
    Jusque là ça va... (Sauf les { } autour de ton hash... Les accolades c'est pour créer une référence de hash anonyme, ici il faut que tu utilises de simples parenthèses).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $be_pattern = $t_send_adjustement -> BrowseEntry( -variable  => \$val_nom_pattern,
     -browsecmd => \&pattern_linker(\$val_pattern, \$val_nom_pattern, \%pattern) );
    Et là ça ne va plus... On peut prendre une référence sur une fonction, ou appeler une fonction, mais pas les deux ! Ce qu'il est éventuellement possible de faire c'est de faire renvoyer une référence de fonction par une fonction. Nous verrons cette technique bientôt. (Par ailleurs j'espère que tu utilises "strict" et que $val_pattern et $val_nom_pattern sont déclarées proprement ?)

    et dans le fichier de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sub pattern_linker($$) {
    	my ($val, $pattern, %hash) = @_ ;
    	$val = $hash -> {$pattern};
    }
    Que vient faire ce prototype ($$) ici ? D'une part il est faux (ta fonction prend trois arguments), d'autre part l'utilisation des prototypes en Perl n'est pas du tout de vérifier le nombre d'arguments ou leur nature, ils sont très mal adaptés à cette tâches. Ils sont là pour modifier le comportement d'une fonction, de façon à "imiter" des built-ins comme grep ou map par exemple. En dehors de cet emploi (plutôt réservé aux concepteurs d'API), il vaut mieux les éviter.

    Tu as donc quatres solutions :
    1. Tu mets le callback dans le même fichier que tu déclares les variables (et après leur déclaration) et tu utilises :
      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
      my %pattern = ( 
        PK => "KATATGKCCRTYTTCTCKMAC",
        NBS5A => "YYTKRTHGTMITKGATGAYGTITGG",
        Myb3 => "ACVGAYAAYGARATCAARAAYYWYTGG" 
      );
       
      my ($val_pattern, $val_nom_pattern);
       
      # ...
       
      my $be_pattern = $t_send_adjustement -> BrowseEntry( -variable  => \$val_nom_pattern,
       -browsecmd => \&pattern_linker );
       
      # ...
       
       
      sub pattern_linker {
      	$val_pattern = $pattern{$val_nom_pattern};
      }
    2. Tu fais un truc sioux : tu crées une fonction à l'intérieur de ta fonction, pour servir de callback, mais avec les variables en paramètres du créateur de fonction... Pas clair ? Voici le code de la fonction :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      sub pattern_linker {
          my( $refval, $refnom, %patterns ) = @_;
          return sub {
              $$refval = $patterns{$$refnom};
          }
      }
      Et le code de $be_pattern :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      my $be_pattern = $t_send_adjustement -> BrowseEntry(
        -variable  => \$val_nom_pattern,
        -browsecmd => pattern_linker(\$val_pattern, \$val_nom_pattern, %pattern), 
      );
    3. Finalement peut-être que tu n'as pas vraiment besoin d'une fonction nommée ! Une fonction anonyme sera au moins aussi courte :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      my $be_pattern = $t_send_adjustement -> BrowseEntry(
        -variable  => \$val_nom_pattern,
        -browsecmd => sub { $val_pattern = $pattern{$val_nom_pattern} }, 
      );
      Et tu n'as plus besoin de pattern_linker() !
    4. Tu utilises des variables globales de paquetage et ... Non finalement oublie ça !


    Evidemment la 3 est recommandée.

    --
    Jedaï

  8. #8
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Points : 39
    Points
    39
    Par défaut
    Merci encore pour cette réponse extrêment clair et pédaguogue!

    Je crois que je me suis embourbé dans de multiple idée qui n'ont fais que emmeller mes neurones

    La 3 troisième solution est de loin celle que je préfère et puis de tout manière c'est elle qui fait intervenir le moins de chose inutile (sous fonction inutile dans ce cas c'est court et on s'en sers qu'une fois...)

    Je test tout ça et si tout marche bien je passe en résolue

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 09/12/2007, 11h51
  2. liste déroulante
    Par leeloo076 dans le forum ASP
    Réponses: 12
    Dernier message: 23/03/2004, 10h35
  3. liste déroulante avec session
    Par leeloo076 dans le forum ASP
    Réponses: 3
    Dernier message: 19/03/2004, 11h01
  4. liste déroulante en ASP vbscript
    Par leeloo076 dans le forum ASP
    Réponses: 9
    Dernier message: 17/03/2004, 16h42
  5. Listes déroulantes liées entre elles
    Par denisC dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 27/07/2002, 15h53

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