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
#!/usr/bin/perl
use Tk;
use Tk::ProgressBar;
use Time::HiRes;
#use warnings;
#use strict;
my $mw = MainWindow->new(-title => 'ProgressBar example');
$mw->configure(-width=>200, -height=>80);
$mw->packPropagate(0); # jetzt wird auf die grösse gepackt
my $progress = $mw->ProgressBar(
-relief => 'sunken',
-borderwidth => 2,
-width => 24,
-from => 0,
-to => 100,
-blocks => 20,
-colors => [ 0, 'green',
50, 'yellow',
80, 'red'],
-variable => \$percent_done
)->pack(-fill => 'x', -padx=> 4, -pady=>4);
sub go {
$_[0]->configure( -state => 'disabled');
for ($i = 0; $i < 1000; $i++) {
$percent_done = $i/10;
print "$i\n";
#Time::HiRes::sleep(0.3);
$mw->update;
}
$_[0]->configure( -state => 'active');
}
$b = $mw->Button(
-text => 'Go!',
-width => 20
#-command => &go($b) # hier bräuchte ich eine referenz auf den Button
)->pack(-side => 'bottom', -pady=>4, -padx=>4);
$b->configure( -command => go($b) ); # läuft sofort los
MainLoop;
my %whatever = ( -command => go($b) ); # läuft sofort los
1 2 3 4 5 6 7
# wenn nur go() ohne argumente aufgerufen werden soll # Referenz auf go() wird direkt verwendet my %whatever = ( -command => \&go ); # läuft sofort los # wenn Du Argumente mitgeben willst, kannst Du das so tun: # Referenz auf anonyme Subroutine, die ihrerseits go() mit Argument $b aufruft my %whatever = ( -command => sub { go($b) } ); # läuft sofort los
2012-02-25T18:58:34 LinuxerHi,
Code: (dl )1
2
3#wenn Du Argumente mitgeben willst, kannst Du das so tun:
#Referenz auf anonyme Subroutine, die ihrerseits go() mit Argument $b aufruft
my %whatever = ( -command => sub { go($b) } );
2012-02-25T19:58:15 LinuxerHi,
1. ich hatte einen Bug in meinem obigen Code, ist nun gefixt; korrekt muss es heissen: \&go (also ohne Klammern)
Quote2. Wenn Du eine benannte Sub referenzieren willst, nimmmst Du den Namen der Sub, setzt \& davor, und das war es.
QuoteArgumente, egal wie viele, können auf diese Art nicht ermittelt/übergeben werden. Wenn man das aus irgendeinem Grund braucht; muss man entweder a) eine weitere benannte Sub schreiben, die die erste mit Argumenten aufruft und dann die zweite Referenzieren; oder man verwendet b) sub {} und definiert eine anonyme Sub, die die gewünschte Sub mit Argumenten aufruft.
1
2
3
4
5
6
use Tk;
my $main = MainWindow->new;
$main->Button(-text => 'End',
-command => [$main => 'destroy']
)->pack;
MainLoop;
1 2 3 4 5 6
use Tk; my $main = MainWindow->new; $main->Button(-text => 'End', -command => [$main => 'destroy'] )->pack; MainLoop;
2012-02-25T20:31:26 LinuxerHier wird keine Sub-Referenz erzeugt. Die eckigen Klammern erzeugen eine Referenz auf einen anonymen Array, der zwei Argumente enthält, $main und 'destroy'.
Quoteperldoc zum Thema Referenzen: ...
-command => [$main => 'destroy']