in reply to How to perform a subroutine run in cpan Tk::ExecuteCommand module
It seems you are trying to make Tk::ExecuteCommand do more than what it was intended for. The easiest way to solve your problem, would be to put all the commands you wish to run, in a separate shell(bash) script, then use ExecuteCommand to execute the shell script. You could even put it all into a second Perl script, if it was easier.
The other alternative is to roll-your-own Tk execute script, for example:
You can modify this code to do what you need or want. Instead of getting your commands from the Entry, you could read it from a subroutine.#!/usr/bin/perl use warnings; use strict; use Tk; use IPC::Open3; require Tk::ROText; $|=1; my $mw = new MainWindow; my $entry=$mw->Entry(-width => 80)->pack; $mw->Button(-text => 'Execute', -command => \&send_to_shell)->pack; my $textwin =$mw->Scrolled('ROText', -width => 80, -bg =>'white', -height => 24, )->pack; $textwin->tagConfigure( 'err', -foreground => 'red' ); my $pid = open3( \*IN, \*OUT, \*ERR, '/bin/bash' ) or warn "$!\n"; $mw->fileevent( \*OUT, readable => \&read_stdout ); $mw->fileevent( \*ERR, readable => \&read_stderr ); $entry->bind('<Return>',[\&send_to_shell]); $entry->focus; MainLoop; sub read_stdout { if( sysread( OUT, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer ); $textwin->see('end'); } } sub read_stderr { if( sysread(ERR, my $buffer, 1024 ) > 0 ){ $textwin->insert( 'end', $buffer, 'err' ); $textwin->see('end'); } } sub send_to_shell { my $cmd= $entry->get(); print IN "$cmd\n"; }
Post a fully working example if you need more help.
P.S.
Tk::ExecuteCommand could be used as you desire, by using configure to load different commands from your subroutine.
# in your subroutine $ec->configure( -command => $choice ); $ec->execute_command;
|
|---|