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
choix.pl
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
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__
info.pl
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
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;
L'erreur survient une fois le champs de texte affiché, losrque l'on clique dans l'applcation :
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 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;
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.--- 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 n'ai pas trouvé comment résoudre ce problème.
Merci pour votre aide !
Partager