Вопрос

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

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

Вот сессия:: Раздел создания моего приложения 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,
        );
    ...
}

проверка создает виджет верхнего уровня $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 существует в validate

ih_button_1 нажатый

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

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

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top