Как я могу показать вывод консоли Perl в GUI?
У меня есть несколько простых программ Perl, пишущих на стандартный вывод, но у этого есть некоторые проблемы:
- некоторые из моих пользователей боятся консоли
- мои пользователи работают в Windows, поэтому мой вывод программы отображается на
cmd
консоль, поэтому я не могу контролировать способ отображения (цвета и размер терминала), и хуже того, консоль не может быть изменена (по крайней мере, по ширине)
чтобы решить эти проблемы, я хотел бы иметь возможность отображать вывод в простой интерфейс GUI в качестве опции. GUI должен реагировать до завершения программы (во время ее работы должно быть возможно прокручивать или изменять размер окна).
какой простой инструментарий и виджет я могу использовать для этого? (Я разрабатываю Windows с ActivePerl).
5 ответов
вы можете использовать любой вариант GUI, который вам нравится, а затем вы можете использовать галстук:: STDOUT переопределить поведение print
и printf
в stdout filehandle, чтобы вместо этого сбросить вывод в виджет по вашему выбору. Единственное, что заставить его говорить с вашими виджетами через пакеты чисто с помощью анонимного суб может быть грязным. Вот короткий, грубый пример использования Win32:: GUI:
use Win32::GUI();
use Tie::STDOUT
print => sub {
$main::textfield->Append(@_);
};
my $main = Win32::GUI::Window->new(
-name => 'Main',
-text => 'Perl',
-width => 220,
-height => 230,
);
our $textfield = $main->AddTextfield(
-name => "Output",
-left => 8,
-top => 8,
-width => 180,
-height => 180,
-readonly => 1,
-multiline => 1,
-vscroll => 1,
);
$main->Show();
sub Main_Terminate {
-1;
}
if(!fork()) {
print "Hello.\n";
for (1..20) {
sleep 1;
printf "More output %d\n", $_;
}
} else {
Win32::GUI::Dialog();
}
обратите внимание на вызов Win32::GUI::Dialog()
В конце присутствует, чтобы держать окно от закрытия, как только сценарий будет завершен.
быстрый поиск у вас есть несколько вариантов:
- Perl с NCurses (его графический интерфейс, но он держит его в консоли)
- Perl с wxWindows wxPerl
- PerlTK
- GTK с Perl (см. справочник wikibooks)
кроме того, есть справочник wikibooks для этого.
Если у Вас установлен Firefox на машинах, я работаю над модулем XUL::Gui
что позволяет отображать графический интерфейс Perl с помощью движка рендеринга Firefox. Основываясь на ответе Адама:
use XUL::Gui;
use Tie::STDOUT
print => sub {$ID{text}->value .= join '' => @_};
display Window title=>'Perl', minwidth=>640, minheight=>480,
TextBox( FILL SCROLL id=>'text', multiline=>'true' ),
delay {
print "hello world\n"; # Output goes to the window.
for (1..5) {
printf "More output %d\n", $_;
}
};
Edit: Исправлена ошибка с многострочными возвращаемыми значениями из gui, пример выше теперь лучше. работает с XUL:: Gui 0.35+
Win32::Console:: ANSI позволяет управлять цветами фона и текста и местоположениями, а также размером и заголовком окна командной строки.
AFAIK, он не позволяет вводить мышь, но этого может быть достаточно, если вы просто отображаете прогресс программы.
еще одна возможность-переписать программу на html / javascript и иметь полную интерактивную возможность.
Я часто делаю свою тяжелую работу в perl, а затем создаю и пишу html-программу для пользователя взаимодействие.
или иметь стандартную программу html и позволить perl записать файл json с конкретными данными, прежде чем я вызову программу html.