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 :

Tk : problème de transmission de données entre widgets


Sujet :

Interfaces Graphiques Perl

  1. #1
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut Tk : problème de transmission de données entre widgets
    le decor

    - un champ de saisie avec controle (EntryCheck)
    - un bouton déclencheur (Button)
    - une zone texte (Text)
    - un sous-programme qui multiplie par 2 la donnée saisie et affiche le résultat dans la zone texte

    1ère methode

    le bouton appelle le sous-programme, ce dernier manipule lui-même le champ saisi

    Cela fonctionne

    2ème methode

    le bouton appelle le sous-programme en lui passant le champ saisi en paramètre

    Cela ne fonctionne pas : 0 est affiché. Je ne comprends pas pourquoi.

    -------------

    1ère méthode

    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
    use strict;
    use Tk;
    use Tk::EntryCheck;
    my $saisie;
    my $main = MainWindow->new(-title => 'multiplier par 2');
    my $ymannum = $main->EntryCheck(-maxlength =>3,
                                   -pattern => qr/\d/, # que des chiffres
                                   -textvariable => \$saisie
                                   )->pack( qw/ -side left / );
    my $btmannum= $main->Button(-background => 'yellow', 
                               -text => 'calculez',
                               -command => \&calculez
                               ) -> pack( qw/ -side left / );                               
    my $resu = $main->Text ('-width'=> 40, '-height' => 1
                            )->pack;
    MainLoop;
    sub calculez
    {
    	$resu->delete('1.0', 'end');
        $resu->insert('end', $saisie * 2);
    }
    2ème méthode

    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
    use strict;
    use Tk;
    use Tk::EntryCheck;
    my $saisie;
    my $main = MainWindow->new(-title => 'multiplier par 2');
    my $ymannum = $main->EntryCheck(-maxlength =>3,
                                   -pattern => qr/\d/, # que des chiffres
                                   -textvariable => \$saisie
                                   )->pack( qw/ -side left / );
    my $btmannum= $main->Button(-background => 'yellow', 
                               -text => 'calculez',
                               -command => [\&calculez,$saisie]
                               ) -> pack( qw/ -side left / );                               
    my $resu = $main->Text ('-width'=> 40, '-height' => 1
                            )->pack;
    MainLoop;
    sub calculez
    {
        my ($nombre) = @_;
    	$resu->delete('1.0', 'end');
        $resu->insert('end', $nombre * 2);
    }

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    C'est une erreur classique de débutant.

    Vous avez utilisé la variable $saisie dans l'option -textvariable, ainsi, -textvariable manipule la référence (pointeur) de cette variable.

    Lorsque vous passez $saisie à votre procédure, cette dernière reçoit le contenu de la variable au moment t, donc la valeur 0. Vous aurez beau cliquer 10 fois sur le bouton, c'est zéro qui est passé car c'était la valeur au moment où Perl est passé dessus.

    La méthode 2 doit plutôt passer en argument la référence de $saisie et non $saisie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -command => [\&calculez, \$saisie]
    Ensuite, dans ta procédure, tu fais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub calculez
    {
        my ($ref_nombre) = @_;
        my $nombre = ${$ref_nombre};
    	$resu->delete('1.0', 'end');
        $resu->insert('end', $nombre * 2);
    }
    La meilleure solution est la méthode 3 où tu passerai à ta fonction le widget afin de pouvoir en faire ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -command => [\&calculez, $ymannum]
    Puis dans ta procédure, via les méthodes des widgets Entry, tu récupères ta valeur.

  3. #3
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    merci

    effectivement la methode 2 newlook fonctionne

    et la méthode 3 aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sub calculez
    {
        my ($widg) = @_;
        my $nombre = $widg->get();
    	$resu->delete('1.0', 'end');
        $resu->insert('end', $nombre * 2);
    }

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

Discussions similaires

  1. Problème de type de données entre Java et Postgres
    Par La Piotte dans le forum EDI et Outils pour Java
    Réponses: 1
    Dernier message: 31/01/2008, 20h23
  2. Transmission de donnée entre le 68hc11 et un PC
    Par moumouss dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/12/2007, 21h23
  3. transmission des données entre ASP et le serveur
    Par mademoizel dans le forum ASP
    Réponses: 3
    Dernier message: 17/12/2006, 20h11
  4. [C#]Transmission de données entre forms
    Par fafa139 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/05/2006, 18h44
  5. [Designer] Problème de transfert de données entre modul
    Par BILLYPATOU dans le forum Designer
    Réponses: 11
    Dernier message: 09/03/2004, 18h15

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