Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    HRS
    HRS est déconnecté
    Membre expérimenté Avatar de HRS
    Inscrit en
    mars 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 643
    Points : 576
    Points
    576

    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 :
    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 :
    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
    16 744
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 16 744
    Points : 490 680
    Points
    490 680

    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 :
    -command => [\&calculez, \$saisie]
    Ensuite, dans ta procédure, tu fais ainsi :
    Code :
    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 :
    -command => [\&calculez, $ymannum]
    Puis dans ta procédure, via les méthodes des widgets Entry, tu récupères ta valeur.

    Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !

  3. #3
    HRS
    HRS est déconnecté
    Membre expérimenté Avatar de HRS
    Inscrit en
    mars 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 643
    Points : 576
    Points
    576

    Par défaut

    merci

    effectivement la methode 2 newlook fonctionne

    et la méthode 3 aussi

    Code :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •