p
u
b
l
i
c
i
t
é
publicité
  1. #1
    HRS
    HRS est déconnecté
    Membre expérimenté
    Avatar de HRS
    Inscrit en
    mars 2002
    Messages
    644
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 644
    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 : 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
    17 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : avril 2004
    Messages : 17 690
    Points : 492 622
    Points
    492 622

    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.

    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
    644
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 644
    Points : 576
    Points
    576

    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