如何执行系统命令并在Text Widget表中显示其状态

时间:2014-06-20 03:31:54

标签: perl perltk

我尝试使用CPAN Tk::ExecuteCommand模块中的代码段来实现上述功能,但是当我在$ec->configure(-command部分执行任何Perl程序时,它会给出以下错误。

此外,Perl作业完成后,窗口将意外关闭。如果我只是在条目中打印文本而不是命令(如我注释掉的行),脚本可以工作并且不会被关闭。我选择使用这个Cpan程序,因为我想要两件事:

  1. 在文本小部件中显示系统命令并运行结果。
  2. 在作业运行时让“执行按钮”变为“取消”,以便用户有机会取消正在进行的作业。
    我可以知道如何实现这个目标吗?
  3. 这是我得到的错误信息:

     > /usr/bin/perl: symbol lookup error: /usr/pkgs/perl/5.14.1/lib64/module/default/x86_64-linux/auto/Proc/ProcessTable/ProcessTable.so: undefined symbol: pthread_once
    

    [13]退出127 test1.pl

    以下是我使用的代码:

    #!/usr/bin/perl
    
    use Tk;
    use Tk::ExecuteCommand;
    
    $ec = tkinit()->ExecuteCommand(
         -command    => '',
         -entryWidth => 50,
         -height     => 10,
         -label      => '',
         -text       => 'Execute',
    )->pack;
    $ec->configure(-command => 'perl ./my_script.pl -wrapper wrapper_txt');
    #$ec->configure(-command => 'Text line only');
    $ec->execute_command;
    $ec->update;
    
    MainLoop;
    

1 个答案:

答案 0 :(得分:2)

$ec->configure(-command => 'perl ./my_script.pl -wrapper wrapper_txt');更改为$ec->configure(-command => 'perl my_script.pl -wrapper wrapper_txt');

并获取状态使用下面的子

sub sys {

    # Execute a command asynchronously and return its status and output.

    my $cmd = shift;

    $ec->configure( -command => $cmd );
    my $t = $ec->Subwidget( 'text' ); # ROText widget
    $t->delete( '1.0' => 'end' );
    $ec->execute_command;
    return ($ec->get_status)[0], split /\n/, $t->get( '1.0' => 'end -1 chars' );

} # end sys

要使用按钮杀死它,请查看文档,

  

这个ExecuteCommand mega小部件由一个LabEntry小部件组成   命令条目,启动命令执行的“执行”按钮,和   收集命令执行输出的ROText小部件。虽然   命令正在执行,“Do It”按钮变为“Cancel”按钮   可以过早地杀死执行命令。 kill_command   方法以编程方式执行相同的操作。

因此,您需要$exec->execute_command; $exec->get_status;$exec->kill_command;

编辑:看起来像known issue,尝试使用最新版本的Proc :: ProcessTable。

另见:Bug #41397 for Proc-ProcessTable: Proc::ProcessTable - make test fails "undefined symbol: pthread_once"