2009-07-20 6 views
1

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]; "

+0

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

+0

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

+0

Qu'en est-il défini (tas $ -> {} ih_mw)? – Inshallah

Répondre

2

Où est-ce que $ entasse & valider viens? Vous ne le transmettez pas en paramètre. Est-ce que $ entasser dans & valider et $ empiler dans & in_button_1_press ne pas être la même chose? Avez-vous essayé d'imprimer la forme filante de $ heap pour voir si les adresses sont les mêmes dans les deux fonctions?

+0

Un code manquant; utilisez Tk; utilisez POE qw (Loop :: TkActiveState); De perldoc POE :: Session; POE :: Convention d'appel de session sub handle_event { my ($ noyau, $ tas, paramètre $) = @_ [KERNEL, HEAP, ARG0]; ...; } Ou l'utilisation de C "$ _ [KERNEL]", C "$ _ [HEAP]" et C "$ _ [ARG0]" en ligne, comme cela est fait dans la plupart des exemples. Ce qui se passe ici est plutôt basique. Perl passe les paramètres dans les sous-programmes ou les méthodes en utilisant le tableau @_. "KERNEL", "HEAP", "ARG0" et d'autres sont des constantes exportées par POE :: Session (qui est inclus gratuitement lorsqu'un programme utilise POE). "forme filante de $ tas"? – jpolache

+0

Vous n'avez pas répondu à ma question: d'où vient le tas $ & valider? Vous appelez et validez depuis add_button_press sans aucun argument, donc si vous obtenez $ heap in & validate via $ heap = @_ [HEAP], alors vous allez être surpris. De même, la forme & validate de l'appel de fonction, vs simplement validée, n'hérite pas * @ du contexte d'appel. –

+2

Oups. Cela ne semble pas correct (dans la validation): my $ tas -> {ih_mw} ... Essayez cela sans le «mon», et voir si cela fonctionne mieux. –