Как я могу показать вывод консоли 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() В конце присутствует, чтобы держать окно от закрытия, как только сценарий будет завершен.


быстрый поиск у вас есть несколько вариантов:

  1. Perl с NCurses (его графический интерфейс, но он держит его в консоли)
  2. Perl с wxWindows wxPerl
  3. PerlTK
  4. 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+


wxWidgets используя Wx модуль CPAN популярен в мире Perl прямо сейчас (см. Padre)

однако я не уверен, что это происходит с ActivePerl, который, я считаю, может прийти с Tk.

/ I3az/


Win32::Console:: ANSI позволяет управлять цветами фона и текста и местоположениями, а также размером и заголовком окна командной строки.

AFAIK, он не позволяет вводить мышь, но этого может быть достаточно, если вы просто отображаете прогресс программы.

еще одна возможность-переписать программу на html / javascript и иметь полную интерактивную возможность.

Я часто делаю свою тяжелую работу в perl, а затем создаю и пишу html-программу для пользователя взаимодействие.

или иметь стандартную программу html и позволить perl записать файл json с конкретными данными, прежде чем я вызову программу html.