Понимание пространств имен в POE-Tk - PullRequest
1 голос
/ 20 июля 2009

Я опубликовал «Как понять, как использовать POE-Tk для уничтожения?» в попытке уменьшить ошибку в моем производственном коде до контрольного примера. Но похоже, что решение тестового примера не работает в полной программе.

Программа имеет длину 800+ строк, поэтому я не решаюсь выложить ее полностью. Я понимаю, что приведенные здесь фрагменты могут быть слишком короткими, чтобы их можно было использовать, но я надеюсь получить какое-то указание о том, где искать решение или какую дополнительную информацию я могу предоставить.

Вот раздел Session :: Create моего приложения 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 называется здесь;


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 создает виджет 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 );
    ...
}

Нажатие на $ ih_but1 приводит к этому;

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

кнопка добавления нажата

sub validate называется

! действительный введенный

ih_mw существует в проверке

ih_button_1 нажата

ih_mw не существует в ih_button_1_press

Таким образом, виджет $heap->{ih_mw}, похоже, не известен анонимной подпрограмме ih_button_1_press даже с включением "($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP];"

1 Ответ

2 голосов
/ 20 июля 2009

Откуда берется $ heap in & validate? Вы не передаете это как параметр. Может ли $ heap in & validate и $ heap в & in_button_1_press отличаться друг от друга? Вы пытались распечатать строчную форму $ heap, чтобы увидеть, совпадают ли адреса в двух функциях?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...