Erreur command bound to event
Bonjour à tous,
Pour mon stage je dois réaliser un outil en Perl, langage que je n'ai jamais utilisé.
Après avoir suivi différents cours en ligne, je me suis lancé.
Malheureusement, je suis bloqué.
Voici un petit programme totalement inutile mais qui recrée mon erreur.
J'utilise 3 fichiers :
- main.pl contenant la fenetre principale
- choix.pl contenant une fonction qui affiche un liste déroulante
- info.pl contenant une fonction qui affiche un champ de texte
Les scripts en questions :
main.pl
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Tk;
require Tk::ErrorDialog;
require 'choix.pl';
require 'info.pl';
#Declarer les fonctions
sub Quitter;
#Declrarer variables
my $fen_principale;
my $barre_menu;
my $barre_statut;
my $menu_gen;
my $frame_central;
my $bloc_equipement;
#Creer la fentetre principal
$fen_principale = MainWindow->new();
$fen_principale->minsize( '800', '600' );
$fen_principale->title("TEST");
#Creer barre menu
$barre_menu = $fen_principale->Frame( -relief => 'groove', -borderwidth => 2 );
#creer barre menu general
$menu_gen = $barre_menu->Menubutton(
-text => 'Fichier',
-tearoff => 0,
-menuitems => [
[
'command' => 'Quitter',
-command => \&Quitter
]
]
);
#Creer widget central
$frame_central =
$fen_principale->Frame( -relief => 'groove', -borderwidth => 2 );
#Remplir frame centrale pour choisir truc
GetWidgetChoix( $frame_central, $bloc_equipement );
# placer les widgets
$menu_gen->pack( -side => 'left' );
$barre_menu->pack( -side => 'top', -anchor => 'n', -fill => 'x' );
#$barre_statut->pack( -side => 'bottom', -fill => 'both' );
$frame_central->pack( -anchor => 'center', -fill => 'both' );
#attendre la modification de la variable bloc equipement avant de continuer la mainloop
$fen_principale->waitVariable( \$bloc_equipement );
#effacer contenu de la frame centrale
$frame_central->destroy() if Tk::Exists($frame_central);
$frame_central =
$fen_principale->Frame( -relief => 'groove', -borderwidth => 2 )->pack();
#afficher info
GetWidgetInfo( $frame_central );
#boucle d'interception des evenements
MainLoop;
#fermer l'application
sub Quitter {
exit(0);
}
__END__ |
choix.pl
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| #!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Tk;
use Tk::BrowseEntry;
#Declarer Variables
my $choix;
my $bloc;
#Declarer les fonctions
sub GetWidgetChoix;
sub Valider;
sub GetWidgetChoix {
my $parent = shift;
$bloc = \shift;
$choix = "";
my $label = $parent->Label( -text => "Choisir :" )->pack();
my $menu_deroulant_ligne = $parent->BrowseEntry(
-label => 'Choix : ',
-variable => \$choix,
-state => 'readonly',
-disabledforeground => 'black',
)->pack();
# ajouter nom menu deroulant
$menu_deroulant_ligne->insert( 'end', "foo" );
$menu_deroulant_ligne->insert( 'end', "bar" );
my $bouton = $parent->Button(
-text => 'Valider',
-command => [ \&Valider ]
);
$bouton->pack();
$parent->update();
}
# Modifier valeur bloc equipement, permet reprendre mainloop dans le main
# args : rien
# return : rien
sub Valider {
$$bloc = "coucou";
}
1; |
info.pl
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 warnings;
use utf8;
use Tk;
use Tk::ROText;
sub GetWidgetInfo {
my $parent = shift;
my $label = $parent->Label( -text => "Info Pôle :" )->pack();
#Creation d'une zone de texte
my $labelInfo = $parent->Label(
-background => "white",
-text => "test"
)->pack();
$parent->update();
}
1; |
L'erreur survient une fois le champs de texte affiché, losrque l'on clique dans l'applcation :
Citation:
--- Begin Traceback ---
Can't call method "butUp" on an undefined value at /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/Tk/BrowseEntry.pm line 375.
<ButtonRelease-1>
(command bound to event)
Je suppose que le gestionnaire d'évènements s'attend à ce que la liste déroulante bind mon évènement mais celle-ci est détruite, donc erreur.
Je n'ai pas trouvé comment résoudre ce problème.
Merci pour votre aide !