Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re^2: GUI to dynamically show program output

by markong (Pilgrim)
on Feb 05, 2021 at 00:31 UTC ( [id://11127908]=note: print w/replies, xml ) Need Help??


in reply to Re: GUI to dynamically show program output
in thread GUI to dynamically show program output

kcott, thank you very much!

The example really does what I need but unfortunately it doesn't show correctly the progress bar of the command. This is probably due to the fact that the textual progress bar includes a counter which is implemented by printing "\r" char (below the entire C function).

void doProgress(char* label, size_t step, size_t total) { //progress width const int pwidth = 60; //minus label len size_t width = pwidth - strlen(label); size_t pos = (step * width) / total; size_t percent = (step * 100) / total; printf("\r%s%4d/%4d [", label, step, total); int i; //fill progress bar with = for (i = 0; i < pos; i++) { printf("%c", '='); } //fill progress bar with spaces printf("% *c", width - pos + 1, ']'); printf("%3d%%", percent); fflush(stdout); }

The net result is that I get a mess displayed when I add the text to the TextView, because TextView doesn't interpret char escape sequences. I get the same result using Tk::DoCommand.

After a little bit of searching I think that I could probably solve the thing by using pseudo-ttys in Tk or even embedding Xterm(1) inside Tk !

The two examples are all in python, so I'd just ask if the same can be done with Perl Tk (maybe playing with IPC::Run module pseudo-ttys support) ?

Comments and further suggestions are always welcome!

Replies are listed 'Best First'.
Re^3: GUI to dynamically show program output
by kcott (Archbishop) on Feb 05, 2021 at 07:00 UTC
    "... really does what I need but ... doesn't show correctly ... probably due to ... printing "\r" char ..."

    Well, I obviously had to make an initial guess about how the textual progressbar was implemented; however, you'll be glad to know that can be very easily fixed. :-)

    I rewrote the "Fill X" callback so that it gives a rough approximation of what your doProgress() is printing. I left in the all-important \r but didn't bother adding the percentage calculation.

    $fill_x->configure(-command => sub { $_->configure(-state => 'disabled') for $fill_x, $fill_y; my $ms = 50 * (1 + int rand 10); my $iters = 1 + int rand 100; my $iter = 0; my $id; my $label = 'LABEL'; $id = $mw->repeat($ms, sub { if (++$iter <= $iters) { text_show($text, sprintf "\r%s%4d/%4d [%s]", $label, $iter, $iters, '=' x $iter ); } else { text_show($text, "\nDone!\n"); $id->cancel; $_->configure(-state => 'normal') for $fill_x, $fill_y; } }); });

    I then added some code to text_show() to handle the \r.

    { my ($line, $char); BEGIN { ($line, $char) = (1, 0) } sub text_show { my ($text, $str) = @_; if (0 == index $str, "\r") { $str = substr $str, 1; $text->delete("$line.0", "$line.$char"); $char = 0; } $text->insert("$line.$char" => $str); if (-1 < index $str, "\n") { $line += $str =~ y/\n//; $char = length(substr $str, rindex $str, "\n") - 1; } else { $char += length $str; } $text->see("$line.$char"); } }

    You may notice that I also moved the $text->see("$line.$char") statement. It logically makes more sense for this to occur after $line and $char have been recalculated; although, visually I couldn't see any difference. It probably depends on the size of the GUI window, how you've implemented scrollbars, and the value of -wrap. I'll leave you to play around with that part.

    I didn't change anything else in the original code I posted. So, just change those two blocks of code; give it a whirl; and see how you go.

    Minor update: With the numbers being displayed, I noticed an off-by-one error in the "Fill X" callback: I changed ++$iter < $iters to ++$iter <= $iters. The same error exists in the "Fill Y" callback: fix it if you want; it would only be noticeable if $iters randomised to 1, in which case you'd get no output.

    — Ken

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11127908]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (4)
As of 2024-03-28 17:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found