Я пытаюсь создать приложение 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'],
);
}