Thread Tk --> parallel zur Konsolenanwendung (8 answers)
Opened by Lebowski at 2011-07-10 15:25

MatthiasW
 2011-07-10 17:06
#150272 #150272
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Dazu würde ich $mw->fileevent(...) benutzen, sodass die Aktualisierungsinformationen per STDIN übermittelt werden können. Ein funktionierendes Beispielskript:
more (9.9kb):
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"'

View full thread Tk --> parallel zur Konsolenanwendung