Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Interfaces Graphiques
Interfaces Graphiques Forum d'entraide pour les interfaces graphiques en Perl (TK, GTK, Tk-Zinc, 2D et 3D avec OpenGPL, ....). Avant de poster, veuillez consulter la FAQ Perl/Tk , les cours Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 24/04/2012, 11h27   #1
HRS
Membre éprouvé
 
Avatar de HRS
 
Inscription : mars 2002
Messages : 620
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 620
Points : 491
Points : 491
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);
}
HRS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2012, 12h39   #2
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 520
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 520
Points : 31 666
Points : 31 666
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 !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/04/2012, 13h15   #3
HRS
Membre éprouvé
 
Avatar de HRS
 
Inscription : mars 2002
Messages : 620
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 620
Points : 491
Points : 491
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);
}
HRS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h15.


 
 
 
 
Partenaires

Hébergement Web