2009-07-20 4 views
1

Ich postete "How to undersand the POE-Tk use of destroy?" in einem Versuch, den Fehler in meinem Produktionscode zu einem Testfall zu reduzieren. Aber es scheint, dass die Lösung für den Testfall nicht im vollen Programm funktioniert.Namespaces in POE-Tk verstehen

Das Programm ist 800+ Zeilen lang, so dass ich zögere, es vollständig zu posten. Ich bin mir bewusst, dass die hier bereitgestellten Ausschnitte vielleicht zu kurz sind, um nützlich zu sein, aber ich hoffe, dass ich eine Richtung finde, wo ich nach einer Lösung suchen kann oder welche zusätzlichen Informationen ich bereitstellen kann.

Hier ist der Abschnitt Session :: Create meiner POE-Tk App.


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 heißt hier;


sub pop_up_add { 
    ... 
    my $add_but_2 = $add_frm_2->Button( 
     -text => "Add Record", 
     -command => $session->postback("add_button_press"), 
     -font => "{Arial} 12 {bold}") -> pack(
      -anchor => 'c', 
      -pady => 6, 
     ); 
    ... 
}

Validate schafft die Toplevel-Widget $ 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); 
    ... 
}

Drücken von $ ih_but1 führt dazu;

C:\scripts\alias\resource>alias_poe_V-3_0_par.pl

Add-Taste gedrückt

Unter Validate

genannt! gültig eingegeben

ih_mw in validate

ih_button_1 gedrückt

ih_mw existiert nicht in ih_button_1_press

Also das $heap->{ih_mw} Widget scheint zu sein, unkown zum ih_button_1_press anonymen Unterprogramm auch mit der Aufnahme von "($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; existiert "

+0

Bitte versuchen Sie festzustellen, ob sowohl $ heap als auch $ heap -> {ih_mw) tatsächlich definiert sind(). Wenn $ heap nicht definiert ist, können Sie möglicherweise das gleiche Problem wie in Ihrem vorherigen Post haben. – Inshallah

+0

Ich habe ein if (definiert ($ heap)) vor dem if (Tk :: Exists ($ heap -> {ih_mw})) hinzugefügt. Es kam zurück, dass $ Heap definiert ist. ih_button_1 gedrückt ... Haufen definiert ... ih_mw nicht in ih_button_1_press existiert ... – jpolache

+0

Was definiert ($ heap -> {ih_mw})? – Inshallah

Antwort

2

Wo ist $ Heap in & validieren herkommen? Sie übergeben es nicht als Parameter. Könnte $ Heap in & validieren und $ Heap in & in_button_1_press nicht die gleiche Sache sein? Haben Sie versucht, die strangartige Form von $ heap zu drucken, um zu sehen, ob die Adressen in beiden Funktionen identisch sind?

+0

Fehlender Code; Verwenden Sie Tk; Verwenden Sie POE qw (Loop :: TkActiveState); Von perldoc POE :: Sitzung; POE :: Session Aufrufkonvention sub handle_event { meine ($ kernel, $ heap, $ parameter) = @_ [KERNEL, HEAP, ARG0]; ...; } Oder die Verwendung von C "$ _ [KERNEL]", C "$ _ [HEAP]" und C "$ _ [ARG0]" inline, wie es in den meisten Beispielen getan wird. Was hier vor sich geht, ist eher einfach. Perl übergibt Parameter an Subroutinen oder Methoden, die das Array @_ verwenden. "KERNEL", "HEAP", "ARG0" und andere sind Konstanten, die von POE :: Session exportiert werden (das ist kostenlos enthalten, wenn ein Programm POE verwendet). "Stringy Form von $ Heap"? – jpolache

+0

Sie haben meine Frage nicht beantwortet: Woher kommt $ heap in & validate? Sie rufen & validate von add_button_press ohne Argumente ab. Wenn Sie also $ heap in & validate über $ heap = @_ [HEAP] erhalten, werden Sie eine Überraschung erleben. Auch die & validate-Form des Funktionsaufrufs, vs nur einfach validieren, erbt * nicht * @_ aus dem aufrufenden Kontext. –

+2

Whoops. Das sieht nicht richtig aus (in validate): mein $ haufen -> {ih_mw} ... Versuchen Sie das ohne das 'meine', und sehen Sie, ob es besser funktioniert. –