Thread Tk --> parallel zur Konsolenanwendung
(8 answers)
Opened by Lebowski at 2011-07-10 15:25
Dazu würde ich $mw->fileevent(...) benutzen, sodass die Aktualisierungsinformationen per STDIN übermittelt werden können. Ein funktionierendes Beispielskript:
Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 #!/usr/bin/perl use 5.010; use strict; use warnings; use autodie; use Tk; require Tk::ProgressBar; my $mw = tkinit; my $progress_bar = $mw->ProgressBar( -variable => \my $p, -length => 500, # width -width => 30, # height -blocks => 50, -resolution => 2, -from => 0, -to => 100, -colors => [ 0, 'green', ], )->pack( -fill => 'x', ); my $update_text = "-"; my $label = $mw->Label( -textvariable => \$update_text, )->pack; $mw->fileevent(\*STDIN, readable => \&update); MainLoop; sub update { my $line = <STDIN>; if (! defined $line) { $mw->fileevent(\*STDIN, readable => ''); return; } if ($line =~ m!(\d+)/(\d+)!) { $update_text = "$1 / $2"; $p = $2 ? $1 / $2 : 1; $p *= 100; } } Die Ausgabe deines Skripts muss an dieses hier umgeleitet werden, und der Form $A/$N entsprechen. Beispielaufruf: Code: (dl
)
$ perl -E '$|++; for (1..10) { say "$_/10"; sleep 1 }' | perl gui.pl Hier musste ich noch autoflush setzen, allerdings weiß ich nicht genau warum. Vielleicht könnte da jemand was zu sagen, der mehr Ahnung hat? MfG perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
|