1

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

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

  1. 在文本小部件中显示系统命令和运行结果。
  2. 在作业运行时让“执行按钮”变为“取消”,以便用户有机会取消正在进行的作业。
    我可以知道如何实现吗?

这是我得到的错误消息:

 > /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;
4

1 回答 1

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 巨型小部件由用于命令输入的 LabEntry 小部件、启动命令执行的“执行”按钮和收集命令执行输出的 ROText 小部件组成。在命令执行时,“执行”按钮变为“取消”按钮,可以提前终止正在执行的命令。kill_command 方法以编程方式执行相同的操作。

所以你需要$exec->execute_command; $exec->get_status;$exec->kill_command;

编辑:看起来像一个已知问题,尝试使用最新版本的 Proc::ProcessTable。

另请参阅:Proc-ProcessTable 的错误 #41397:Proc::ProcessTable - 使测试失败“未定义符号:pthread_once”

于 2014-06-20T03:56:27.340 回答