2009-12-08 179 views
8

我有幾個簡單的Perl程序寫入到標準輸出,但是這也存在一些問題:如何在GUI中顯示Perl控制檯輸出?

  • 我的一些用戶通過控制檯
  • 我的用戶在Windows上運行害怕,所以顯示我的程序輸出一個cmd控制檯上,所以無法控制它被顯示(顏色和終端大小),並且更壞的方式,控制檯不是(至少在寬度)

可調整大小爲了解決這些問題,我想能夠以簡單的GUI界面作爲選項顯示輸出。 GUI應該是響應式的,直到程序結束(應該可以在窗口運行時滾動或調整窗口大小)。

我可以用什麼簡單的工具包和小部件來做到這一點? (我用ActivePerl在Windows上開發)。

回答

10

你可以使用任何你喜歡的圖形用戶界面選項,那麼你可以使用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()存在,保持窗口從一旦腳本完成關閉。

+0

這是一個好的開始。還有一個問題:在程序到達Win32 :: GUI :: Dialog之前,GUI不響應。也許我應該嘗試使用2個線程? – Jazz 2009-12-08 22:35:02

+0

@Jazz:是的,其實你可以使用'fork()',windows的fork模擬會爲你處理。我編輯了我的答案以顯示更改。 – 2009-12-09 00:22:42

5

從你有幾種選擇快速搜索:

  1. Perl with NCurses(它是一個圖形用戶界面,但它一直在控制檯中)與wxWindows的
  2. 的Perl wxPerl
  3. PerlTK
  4. GTK與Perl(見wikibooks參考)

另外,還有一個wikibooks reference爲此。

+0

具有NCurses的Perl無法解決我的問題,並且使用wxPerl,PerlTK或GTK時,如何重定向控制檯輸出? – Jazz 2009-12-08 13:28:55

+0

您將不得不創建一個與運行控制檯應用程序併發送輸入的GUI應用程序進行通信的標準方式。或者你可以重寫應用程序。 – monksy 2009-12-08 13:32:32

+0

我希望已經存在的解決了這個問題的東西... – Jazz 2009-12-08 14:03:30

1

wxWidgets使用Wx CPAN模塊在Perl世界流行的現在(見Padre

但是我不知道這個自帶的activeperl我相信可能會與Tk代替。

/I3az/

+0

它如何解決我的控制檯輸出問題? – Jazz 2009-12-08 13:21:47

+0

從5.10起ActivePerl自帶Tkx代替Tk,儘管Tk仍然可以通過PPM使用。 (Tkx是與Tcl/Tk綁定的備選集合。) – 2009-12-08 13:44:11

+0

@Jazz - 你可以考慮使用消息/日誌記錄隊列選項,而不是使用STDOUT?例如。像Message :: Stack(http://search.cpan.org/dist/Message-Stack/)。 – draegtun 2009-12-08 15:03:13

4

如果你在機器上安裝了Firefox,我一直在使用模塊XUL::Gui,它可以讓你使用Firefox的渲染引擎顯示你的Perl gui。建立在Adam的答案上:

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+

+0

只看代碼,我期望'。= join($,@_)。 $ \',但我實際上並沒有玩過它。 – ephemient 2009-12-14 19:59:37

+0

@ephemient =>謝謝,更新 – 2009-12-14 20:17:21

0

Win32 :: Console :: ANSI允許您控制背景和文本的顏色和位置以及命令行窗口的大小和標題。

AFAIK,它不允許鼠標輸入,但它可能是足夠的,如果你只是顯示程序進度。

另一種可能性是用html/javascript重寫程序,並具有完整的交互功能。

我經常在perl中完成我的重任,然後構造並寫出一個用於用戶交互的html程序。

或者有一個標準的html程序,讓perl在調用html程序之前用特定的數據寫出一個json文件。