2014-12-30 2 views
2

버튼을 클릭하면서 외부 명령을 실행할 수있는 Perl + Tkx로 인터페이스를 만들려고합니다.GUI를 차단하지 않고 Perl/Tkx에서 외부 명령 실행 (Windows)

Tk 모듈로 진행하는 방법에 대해서는 많은 문서가 있지만 Tkx에서는 거의 다루지 않습니다.

나는 여전히 this one과 같은 몇 가지를 발견했지만, 내 예제에서는 제대로 작동하지 않습니다. 특히 게시물에는 Tkx :: open, Tkx :: configure 및 Tkx :: fileevent의 사용이 포함되어 있지만 이들을 함께 결합하는 방법을 알지 못했습니다.

다음은 내가 시도하는 코드입니다. 버튼을 클릭하고 자식 프로세스를 종료하기 위해 키를 누르면, Perl은 오류 Free to wrong pool 16389d0 not 328e448 at C:/Perl/lib/Tcl.pm line 433.을 반환합니다.

참고 : ActivePerl 5.12.2를 사용하고 있습니다. 이 문제에 거의 이일 지출 후

use Tkx; 
use strict; 

my $mw = Tkx::widget->new("."); 
my $button=$mw->new_ttk__button(-text => "Run", -command => [\&run_cmd, 0]); 
$button->g_grid(-column => 0, -row => 0); 
my $text = $mw->new_tk__text(-width => 32, -height => 16); 
$text->configure(-state => "disabled"); 
$text->g_grid(-column => 0, -row => 1); 
Tkx::MainLoop(); 

sub run_cmd { 
    if (fork()==0) { 
     system "pause"; 
     exit 0; 
    } 
} 

감사

답변

1

나는 마침내 내가 TKX에 적응 티클의 코드 게시물 here에 대한 답변 덕분에 발견했다.

해결 방법은 Tkx::open ("읽기"및 "닫기"와 함께 사용)입니다.

아래의 코드는 GUI를 차단하지 않고 명령을 올바르게 실행할 수 있지만 대부분의 경우 STDOUT 및 STDERR (Java에서 개발 한 응용 프로그램을 실행하지만 systeminfo 또는 diff -v은 실행하지 않음)을 검색하지 못했습니다.

아무도 그것에 대한 통찰력이 있다면, 주저하지 말고 논평하십시오.

감사

use Tkx; 
use strict; 
use Data::Dumper; 

my ($stdout,$stderr); 

my $mw = Tkx::widget->new("."); 
my $button=$mw->new_ttk__button(-text => "Run", -command => [\&run_command, "systeminfo"]); 
$button->g_grid(-column => 0, -row => 0); 
my $text = $mw->new_tk__text(-width => 32, -height => 16); 
$text->insert("end", "Test\n"); 
$text->g_grid(-column => 0, -row => 1); 

Tkx::MainLoop(); 
print "STDOUT: $stdout\n\n","-"x24,"\nSTDERR: $stderr\n"; 


sub run_command { 
    my $cmd = shift; 
    my $fh = Tkx::open("| $cmd", 'r') or die "$!"; 
    Tkx::fconfigure($fh, -blocking => 0); 
    $stdout.=Tkx::read($fh); 
    eval { Tkx::close($fh); }; 
    [email protected] if ([email protected]); 

}