Curses :: UI :: Dialog не отвечает на клавишу ввода - PullRequest
3 голосов
/ 14 октября 2011

Я пытаюсь создать приложение Curses :: UI. Пока все работает, но мой диалог не хочет отвечать на клавишу ввода для закрытия. Я пробовал образцы, и они работают, но по какой-то причине, если я делаю это таким образом, Диалог не реагирует на нажатия клавиш. Смотрите, содержимое в главном окне будет заполнять экран и обновляться каждые x секунд, поэтому я бы хотел, чтобы диалоговое окно перекрывало экран и закрывалось при вводе. Вот код из моего тестового скрипта.

Если вы запустите его, экран будет обновляться каждые 10 секунд, отображая время внизу слева. После обновления нажмите X, чтобы открыть фиктивный диалог. При следующем обновлении данные экрана будут закрывать диалоговое окно, которое все еще активно. Нажмите Enter, чтобы выйти из диалогового окна, и затем вы можете выйти.

Моя цель - сохранить этот диалог поверх всего.

#!/usr/local/bin/perl

use strict;
use warnings;
use Curses::UI;

my ($dialog, $main, $ui, $container, $content);
my $last_update = 0;
my $first_run = 0;
$ui = Curses::UI->new(
    -color_support  =>  1,
    -mouse_support  =>  0,
    -border         =>  1,
    -debug          =>  0
);

$main = $ui->add(
    "main", "Window",
    -bfg        =>  "black",
    -x      =>  0,
    -y      =>  0,
    -height     =>  $ui->height,
    -width      =>  $ui->width
);

$main->focus();

$ui->set_binding( sub { $ui->leave_curses; exit(0); }, "q");
$ui->set_binding( \&exit, "x");
$ui->add_callback("callback", \&callback );
$ui->{-read_timeout} = 0.1;
$ui->mainloop;

sub callback {
    if($first_run == 0) {
        update_body();
        $first_run = 1;
    }

    my $now = time;
    if($now - $last_update >= 10) {
        update_body();
        $last_update = time;
    }
}

sub update_body {
    for(my $x = 0; $x < 2000; $x++) {
        $main->delete("body$x");
    }

    for(my $x = 0; $x < ($ui->height - 5); $x++) {
        my $now = time;
        $main->add(
            "body$x",       "Label",
            -x      =>  0,
            -y      =>  $x,
            -text       =>  $now,
            -width      =>  $ui->width
        )->draw();
    }
}

sub exit {
    my $return = $ui->dialog(
        -message   => "Test dialog",
        -title     => "Test",
        -buttons   => ['ok'],
    );
}

1 Ответ

0 голосов
/ 29 октября 2012

Вы не должны удалять и перерисовывать поля ввода, есть измененная версия:

#!/usr/bin/perl

use strict;
use warnings;
use Curses::UI;

my ($dialog, $main, $ui, $container, $content);
my $last_update = 0;
my $first_run = 0;
$ui = Curses::UI->new(
    -color_support  =>  1,
    -mouse_support  =>  0,
    -border         =>  1,
    -debug          =>  0
);

$main = $ui->add(
    "main", "Window",
    -bfg        =>  "black",
    -x      =>  0,
    -y      =>  0,
    -height     =>  $ui->height,
    -width      =>  $ui->width
);

$main->focus();

$ui->set_binding( sub { $ui->leave_curses; exit(0); }, "q");
$ui->set_binding( sub { exit(0) if wexit(); }, "x");
$ui->add_callback("callback", \&callback );
$ui->{-read_timeout} = 0.1;
$ui->mainloop;

sub callback {
    if($first_run == 0) {
        draw_body();
        $first_run = 1;
    }

    my $now = time;
    if($now - $last_update >= 2) {
        update_body();
        $last_update = time;
    }
}
my @fields;
sub draw_body {
    for(my $x = 0; $x < ($ui->height - 5); $x++) {
        my $now = time;
        push @fields, $main->add(
            "body$x",       "Label",
            -x      =>  0,
            -y      =>  $x,
            -text       =>  $now,
            -width      =>  $main->width
        );
    }
    $ui->draw();
}
sub update_body {
    map { $_->text(time())  } @fields;
    $ui->draw();
}
sub wexit {
    return $ui->dialog(
        -message   => "Test dialog",
        -title     => "Test",
        -buttons   => ['ok'],
    );
}
...