2009-07-20 3 views
1

게시판에 버그를 줄이기 위해 "How to undersand the POE-Tk use of destroy?"을 게시했습니다. 그러나 테스트 케이스에 대한 해결책이 전체 프로그램에서 작동하지 않는 것 같습니다.POE-Tk의 네임 스페이스 이해

프로그램의 길이가 800 줄 이상이므로 전적으로 게시하는 것을 주저합니다. 여기서 제공하는 스 니펫은 사용하기에 너무 짧을 수도 있지만, 솔루션을 찾을 곳이나 제공 할 수있는 추가 정보에 대해 어느 정도 방향을 잡기를 바랍니다.

다음은 POE-Tk 앱의 Session :: Create 섹션입니다.


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이 여기에 호출됩니다.


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, 
     ); 
    ... 
}

유효성 검사는 상위 레벨 위젯 $ 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); 
    ... 
}

$ ih_but1을 누르면 결과가 나타납니다.

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

추가 버튼을

라고

서브 유효성 검사를 누르면! 유효은

ih_mw

는 그래서 $heap->{ih_mw} 위젯도 ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];을 "의 포함으로 ih_button_1_press 익명 서브 루틴에 알 수없는 것 같다 ih_button_1_press

에 존재하지 않는

ih_mw을 누르면

ih_button_1 유효성에 존재 입력 "

+0

$ heap과 $ heap -> {ih_mw)가 실제로 정의되어 있는지 확인해보십시오(). $ heap이 정의되지 않은 경우 이전 게시물과 동일한 문제가 발생할 수 있습니다. – Inshallah

+0

if (정의 ($ heap))를 if (Tk :: Exists ($ heap -> {ih_mw})) 앞에 추가했습니다. $ heap이 정의 된 것을 다시금 알게되었습니다. 누르면 ih_button_1은 ... 힙이 정의 ... ih_mw이 ih_button_1_press에 존재하지 않는 ... – jpolache

+0

무엇에 대한 정의 ($ 힙 -> {ih_mw})? – Inshallah

답변

2

여기서 $ heap은 &입니다. 유효성 검사에서 왔는가? 매개 변수로 전달하지 마십시오. &에서 $ 힙을 유효화하고 & in_button_1_press의 $ 힙을 동일하게 설정할 수 있습니까? 주소가 두 함수에서 같은지 확인하기 위해 $ heap의 문자열 형식을 인쇄 해 보았습니까?

+0

코드가 누락되었습니다. 사용 Tk; POE를 사용합니다. qw (Loop :: TkActiveState); perldoc에서 POE :: Session; POE :: 세션의 통화 규칙 sub handle_event { my ($ kernel, $ heap, $ parameter) = @_ [KERNEL, HEAP, ARG0]; ...; } 또는 대부분의 예제에서와 같이 C "$ _ [KERNEL]", C "$ _ [HEAP]"및 C "$ _ [ARG0]"인라인을 사용하십시오. 여기에 나오는 것은 다소 기본적인 것입니다. Perl은 @_ 배열을 사용하여 서브 루틴이나 메소드에 매개 변수를 전달합니다. "KERNEL", "HEAP", "ARG0"및 기타는 POE :: Session에서 내 보낸 상수입니다 (프로그램에서 POE를 사용할 때 무료로 포함됩니다). "$ heap의 문자열 형"? – jpolache

+0

당신은 내 질문에 대답하지 않았다. 인수없이 add_button_press에서 호출하고 유효성을 검사합니다. 따라서 $ heap = @_ [HEAP]을 통해 $ heap을 얻고 유효성을 검사하면 깜짝 놀랄 것입니다. 또한 함수 호출의 유효성 검사 형식은 호출 유효성 검사에서 @_ 상속받지 * 않습니다. –

+2

와우. (유효성 검사시) 올바르지 않습니다. my $ heap -> {ih_mw} ... 'my'없이 시도하고 더 잘 작동하는지 확인하십시오. –