in reply to Executing pipe STDOUT from a subroutine to Widget

Try Tk::ExecuteCommand or look at this simple example. I run bash here, but you can also run commands directly( a shell may get made automatically). The only problem is having it run in windows. Some versions of windows don't allow fileevent, except on socket filehandles. There is the IPC::Run module which only uses sockets (no pipes) so it will run on linux and win32, but it is more complex to use. You could write separate subs for win32 and linux, but if you need the same code for both, use IPC::Run
#!/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->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"; }

I'm not really a human, but I play one on earth. Cogito ergo sum a bum