如何在GUI中显示Perl控制台输出?

时间:2009-12-08 13:07:23

标签: windows perl console

我有几个简单的Perl程序写入标准输出,但这有一些问题:

  • 我的一些用户被控制台吓坏了
  • 我的用户在Windows上工作,所以我的程序输出显示在cmd控制台上,所以我无法控制它的显示方式(颜色和终端大小),更糟糕的是,控制台无法调整大小(在最小宽度)

为了解决这些问题,我希望能够在一个简单的GUI界面中显示输出作为选项。 GUI应该响应直到程序结束(应该可以在窗口运行时滚动或调整窗口大小)。

我可以使用哪种简单的工具包和小部件来执行此操作? (我使用ActivePerl在Windows上开发。)

5 个答案:

答案 0 :(得分:10)

您可以使用任何您喜欢的GUI选项,然后您可以使用Tie::STDOUTprintprintf的行为重新定义为STDOUT文件句柄,而不是将输出转储到窗口小部件中你的选择。唯一的事情就是让它使用匿名子程序干净地与你的小部件交谈可能会很麻烦。以下是使用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 :(得分:5)

通过快速搜索,您可以选择以下几种方法:

  1. Perl with NCurses(它是一个GUI,但它将它保存在控制台中)
  2. Perl with wxWindows wxPerl
  3. PerlTK
  4. 使用Perl的GTK(参见wikibooks参考)
  5. 此外,还有一个wikibooks reference

答案 2 :(得分:4)

如果您在计算机上安装了Firefox,我一直在使用模块XUL::Gui,它允许您使用Firefox的渲染引擎显示您的Perl gui。以亚当的答案为基础:

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", $_;
        }
    };

编辑:修复了来自gui的多行返回值的错误,上面的例子现在更好了。适用于XUL :: Gui 0.35 +

答案 3 :(得分:1)

使用wxWidgets CPAN模块的

Wx现在在Perl世界很受欢迎(请参阅Padre

但我不确定这是否附带ActivePerl,我认为可能会附带Tk

/ I3az /

答案 4 :(得分:0)

Win32 :: Console :: ANSI允许您控制背景和文本颜色和位置,以及命令行窗口的大小和标题。

AFAIK,它不允许鼠标输入,但如果你只是显示程序进度就足够了。

另一种可能性是用html / javascript重写程序并具有完全的交互功能。

我经常在perl中进行繁重的工作,然后构建并编写一个用于用户交互的html程序。

或者有一个标准的html程序,让perl在调用html程序之前用特定数据写出一个json文件。