J'ai publié "How to undersand the POE-Tk use of destroy?" dans le but de réduire le bogue de mon code de production à un scénario de test. Mais il semble que la solution au cas de test ne fonctionne pas dans le programme complet. Le programme a une longueur de plus de 800 lignes, donc j'hésite à le publier en entier. Je me rends compte que les extraits que je fournis ici peuvent être trop courts pour être utiles, mais j'espère avoir une idée de l'endroit où chercher une solution ou des informations supplémentaires que je peux fournir.Comprendre les espaces de noms dans POE-Tk
Voici la section Session :: Create de mon application POE-Tk.
POE::Session->create(
inline_states => {
_start => \&ui_start,
get_zone => \&get_zone,
ping => \&ping,
mk_disable => \&mk_disable,
mk_active => \&mk_active,
pop_up_add => \&pop_up_add,
add_button_press => sub {
my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
print "\nadd button pressed\n\n";
&validate;
},
ih_button_1_press => sub {
my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
print "\nih_button_1 pressed\n\n";
if(Tk::Exists($heap->{ih_mw})) {
print "\n\nih_mw exists in ih_button_1_press\n\n";
} else {
print "\n\nih_mw does not exist in ih_button_1_press\n\n";
}
1;
$heap->{ih_mw}->destroy if Tk::Exists($heap->{ih_mw});
&auth;
},
pop_up_del => \&pop_up_del,
auth => \&auth,
# validate => \&validate,
auth_routine => \&auth_routine,
raise_widget => \&raise_widget,
del_action => \&del_action,
over => sub { exit; }
}
);
add_button_press
est appelée ici; Validate crée le widget Toplevel $ heap -> {ih_mw};
sub validate {
...
if(! $valid) {
print "\n! valid entered\n\n";
$heap->{label_text} .= "Add record anyway?";
my $lt_ref = \$heap->{label_text};
...
my $heap->{ih_mw} = $heap->{add_mw}->Toplevel(-title => "ih_mw");
...
if(Tk::Exists($heap->{ih_mw})) {
print "\n\nih_mw exists in validate\n\n";
} else {
print "\n\nih_mw does not exist in validate\n\n";
}
...
my $ih_but1 = $heap->{ih_mw}->Button(-text => "Add",
-font => 'vfont',
-command => $session->postback("ih_button_1_press"),
)->pack(-pady => 5);
...
}
Appuyer sur $ ih_but1 entraîne ceci;
C:\scripts\alias\resource>alias_poe_V-3_0_par.pl
bouton Ajouter pressé
sous validate appelé
! saisi valide
ih_mw
existe dans validate
ih_button_1
pressé
ih_mw
n'existe pas dans ih_button_1_press
Ainsi le widget $heap->{ih_mw}
semble être unkown à la ih_button_1_press
sous-programme anonyme, même avec l'inclusion de "($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];
"
Veuillez essayer de voir si $ heap et $ tas -> {ih_mw) sont définis(). Si $ tas n'est pas défini, vous pouvez toujours avoir le même problème que dans votre post précédent. – Inshallah
J'ai ajouté un if (défini ($ tas)) devant le if (Tk :: Exists ($ heap -> {ih_mw})). Il est revenu que $ tas est défini. ih_button_1 pressé ... tas est défini ... ih_mw n'existe pas dans ih_button_1_press ... – jpolache
Qu'en est-il défini (tas $ -> {} ih_mw)? – Inshallah