【问题标题】:How can I show Perl console output in a GUI?如何在 GUI 中显示 Perl 控制台输出?
【发布时间】:2009-12-08 13:07:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: windows perl console


    【解决方案1】:

    您可以使用任何您喜欢的 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() 的调用是为了防止窗口在脚本完成后立即关闭。

    【讨论】:

    • 这是一个好的开始。一个问题仍然存在:在程序到达 Win32::GUI::Dialog 之前,GUI 没有响应。也许我应该尝试使用 2 个线程?
    • @Jazz:是的,实际上你可以使用fork(),windows fork 仿真会为你处理。我已经编辑了答案以显示更改。
    【解决方案2】:

    通过快速搜索,您确实有几个选择:

    1. Perl with NCurses(它是一个 GUI,但它保留在控制台中)
    2. Perl 与 wxWindows wxPerl
    3. PerlTK
    4. 带有 Perl 的 GTK(参见 wikibooks 参考)

    此外,还有一个wikibooks reference

    【讨论】:

    • Perl 和 NCurses 不能解决我的问题,而对于 wxPerl、PerlTK 或 GTK,我如何重定向控制台输出?
    • 您必须创建一种与运行控制台应用程序并发送输入的 GUI 应用程序进行通信的标准化方式。或者你可以重写应用程序。
    • 没有用于输出到控制台的共享标准,因此将控制台应用程序自动转换为基于 GUI 的应用程序没有神奇的过程。
    【解决方案3】:

    如果您在机器上安装了 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+

    【讨论】:

    • 只看代码,我希望 `.= join($,, @_) 。 $\`,但我还没有真正玩过它。
    【解决方案4】:

    wxWidgets 使用Wx CPAN 模块现在在 Perl 世界中很流行(请参阅Padre

    但我不确定 ActivePerl 是否附带此功能,我相信它可能附带 Tk

    /I3az/

    【讨论】:

    • 从 5.10 开始,ActivePerl 带有 Tkx 而不是 Tk,尽管 Tk 仍可通过 PPM 获得。 (Tkx 是一组与 Tcl/Tk 的替代绑定。)
    • @Jazz - 您可以考虑使用消息/日志队列选项,而不是玩弄 STDOUT?例如。类似于 Message::Stack (search.cpan.org/dist/Message-Stack)。
    • 我可以使用 Tie::STDOUT 或 Message::Stack,这不是问题。我剩下的问题是如何在程序运行时让响应式 GUI 显示输出。
    【解决方案5】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2021-09-12
      相关资源
      最近更新 更多