Bonsoir.

J'utilise Perl 5.8.4 sous Windows XP, en résolution 1024 x 768.

Si vous exécutez le programme qui suit sous les mêmes conditions, vous obtiendrez une fenêtre avec notamment un bouton "Afficher".

Cliquez sur ce bouton : le widget Text se remplit mais, bien qu'il soit impossible de lire tout son texte en une fois, ses ascenseurs restent "disabled".

En revanche, si vous décommentarisez dans le programme deux instructions qui remplissent directement le widget Text avec la même chaîne de caractères que la première fois, les ascenseurs fonctionnent.

D'autre part, si vous commentarisez la définition du widget Text (qui, dans l'état actuel du programme, applique ce widget sur un cadre) et décommentarisez une autre définition, qui aplique directement le widget Text sur la fenêtre principale, il n'y a pas de problème.

Bug de Perl Tk, ou y a-t-il quelque chose qui m'échappe ?

Merci pour tout avis.

M.

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
 
 
use Tk;
use warnings;
use strict;
 
 
my $mw = MainWindow->new;
my $hauteurEcran = $mw->screenheight();
my $largeurEcran = $mw->screenwidth();
 
my $hauteurBarreDeTaches = ((30 * $hauteurEcran) - ((30 * $hauteurEcran) % 768))/ 768;
 # quotient entier de 30 * $hauteurEcran par 768.
# Utiliser la fonction int ? La valeur 30 est présumée par moi.
 
my $hauteurBarreDeTitre = ((30 * $hauteurEcran) - ((30 * $hauteurEcran) % 768))/ 768;
 # quotient entier de 30 * $hauteurEcran par 768. Utiliser la fonction int ? La valeur 30 est présumée par moi.
 
 
my $hauteurLibreDansApplication = ($hauteurEcran - $hauteurBarreDeTaches) - $hauteurBarreDeTitre;
 
 
my $largeurApplication = int( (95 * $largeurEcran) / 100);
# Je ne prends que les 95/100 pour retirer
# la largeur de l'espèce de barre de tâches
# que l'utilisateur risque d'avoir à droite de son écran.
 
 
 
$mw->configure(
      -width => $largeurApplication,
      -height => $hauteurLibreDansApplication);
 
 
$mw->title("");
 
$mw->geometry("+0+0");
 
my $cadreDuBoutonAfficher = $mw->Frame(
   -borderwidth => 1,
   -relief => 'solid',
                         )->place(
                       -relx => 0.0,
                       -rely => 0.04,
                       -relheight => 0.04,
                       -relwidth => 1,
                       -anchor => "nw",
                                   );
 
 
 
my $boutonAfficher = $cadreDuBoutonAfficher->Button(
                            -text => "Afficher",
                            -command => \&routineAfficher,
                         )->place(
                                      -relx => 0.55,
                                      -rely => 0.0,
                                      -relheight => 1.0,
                                      -relwidth => 0.11,
                                      -anchor => "nw",
                                   );
 
 
my $cadreBasPourBoutonQuitter = $mw->Frame(
                            -borderwidth => 1,
                            -relief => 'solid',
                         )->place(
                                      -relx => 0.0,
                                      -rely => 1.0,
                                      -relheight => 0.04,
                                      -relwidth => 1.0,
                                      -anchor => "sw",
                                  );
 
 
my $boutonQuitter = $cadreBasPourBoutonQuitter->Button(
                           -text => "Quitter",
                           -command => \&fermerFenetrePrincipale,
                               )->pack(
                                       -anchor => 'center',
                                       -fill => 'none',
                                       );
 
 
 
 
 
 
my $cadreDeLaZoneTexte = $mw->Frame(
                            -borderwidth => 1,
                            -relief => 'solid',
                         )->place(
                                      -relx => 0.55,
                                      -rely => 0.12,
                                      -relheight => 0.42,
                                      -relwidth => 0.45,
                                      -anchor => "nw",
                             );
 
 
 
# Dans ce qui suit, on applique $controleTexte sur le cadre
# et non directement sur la fenêtre principale.
# Avec cette méthode, les ascenseurs de $controleTexte
# ne fonctionnent pas
# si on remplit $controleTexte à l'aide du bouton Afficher.
 
my $controleTexte = $cadreDeLaZoneTexte->Scrolled("Text",
                          -scrollbars => 'se',
                          -background => 'grey90',
                                              )->place(
                                      -relx => 0.0,
                                      -rely => 0.63,
                                      -relheight => 0.27,
                                      -relwidth => 1.0,
                                      -anchor => "nw",);
 
 
# Dans ce qui suit (neutralisé),  on applique $controleTexte
# directement sur la fenêtre principale.
# Dans ce cas, les ascenseurs de $controleTexte
# fonctionnent normalement,
# qu'on remplisse $controleTexte par le bouton Afficher pendant l'exécution
# ou qu'on déneutralise avant l'exécution les deux instructions
# qui le remplissent directement.
 
# my $controleTexte = $mw->Scrolled("Text",
#                          -scrollbars => 'se',
#                          -background => 'grey90',
#                                              )->place(
#                                      -relx => 0.55,
#                                      -rely => 0.26,
#                                      -relheight => 0.11,
#                                      -relwidth => 0.45,
#                                      -anchor => "nw",);
 
 
 
 
 
 
 
# Si $controleTexte est rempli par les deux instructions
# qui suivent (et non par la fonction
# associée au bouton "Afficher"),
# les ascenseurs de $controleTexte fonctionnent,
# même si $controleTexte a été appliqué sur le cadre
# et non directement sur la fenêtre principale.
 
# my $titrePourDebug = "15 JUIN 2006. - Arrêté du Gouvernement de la Région de Bruxelles-Capitale modifiant l'arrêté du Gouvernement de la Région de Bruxelles-Capitale du 18 juillet 2000 portant règlement de son fonctionnement et réglant la signature des actes du Gouvernement";
 
# $controleTexte->insert("1.0", $titrePourDebug);
 
 
 
MainLoop;
 
 
 
 
sub fermerFenetrePrincipale
{
  $mw->destroy()
}
 
 
sub routineAfficher
{
 
# Si $controleTexte a été appliqué sur le cadre
# et non directement sur la fenêtre principale,
# si les deux instructions qui suivent
# se trouvent dans la présente routine
# (et non plus haut, où elles sont neutralisées),
# et que, pendant l'exécution du programme,
# on clique sur le bouton "Afficher",
# les ascenseurs de $controleTexte ne fonctionnent pas.
 
  my $titrePourDebug = "15 JUIN 2006. - Arrêté du Gouvernement de la Région de Bruxelles-Capitale modifiant l'arrêté du Gouvernement de la Région de Bruxelles-Capitale du 18 juillet 2000 portant règlement de son fonctionnement et réglant la signature des actes du Gouvernement";
 
 
  $controleTexte->insert("1.0", $titrePourDebug);
 
} # Fin de la sub routineAfficher.