Schrift
[thread]5295[/thread]

zugreifen auf dynamische entry usw.



<< >> 6 Einträge, 1 Seite
Gast Gast
 2007-02-13 21:28
#46217 #46217
Abend,

ich erzeuge anhand der Zeilenanzahl einer Datei mehrere widgets.
Code: (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
    
foreach (@fileinhalt)
{
chomp;
$name[$i] = $frame->BrowseEntry(-text => $i,
-relief => 'sunken',
-command =>   \$tausche_name,
                       -width => '20',
-bg => 'white',
)->grid(-row=>$zeile, -column=>0);


$nummer[$i] = $frame->JComboBox(
                      -entrybackground => 'white',
      -mode => 'editable',
-relief => 'sunken',
-selectcommand =>   \$tausche_nr,
-entrywidth => '4',)
->grid(-row=>$zeile, -column=>1);


$format[$i]  = $frame->Entry(
                      -width=>20)
                      ->grid(-row=>$zeile, -column=>2,);
      $istwert[$i] = $frame->Label(-text => 'Labeltext',
                         -relief => 'ridge',
                         -borderwidth => '5',
                         -width=>30)
                        ->grid(-row=>$zeile, -column=>3,);

$zeile++;
$i++;
}


Leider weiß ich nun nicht wie ich in z.B. der sub "tausche_name" abfragen kann welches der "vielen" $name[$i] Entrys es war.
Ich brauche die Nummer [$i] des widgets damit ich auch auf die anderen widgets in der "zeile" zugreifen kann.

                Danke
                   worst_case
PerlProfi
 2007-02-13 23:06
#46218 #46218
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Du musst einfach $i an deine Funktion übergeben.
Da gibt es 2 Wege.

1) Mit einem anonymen Array, das -command zugewiesen wird:
Code: (dl )
-command => [\&funktionsname, $i]


2) Mit einer anonymen Funktion, die -command zugewiesen wird:
Code: (dl )
-command => sub { funktionsname($i) }


MfG
Sucher
 2007-03-27 00:15
#46219 #46219
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Diese zwei Formulierungen bewirken unterschiedliche Dinge:

1) kopiert den Wert von $i bei der Erzeugung des Callbacks.

2) greift beim Aufruf auf das aktuelle $i zu.

Im gegebenen Beispiel macht das einen Unterschied, und nur die erste Variante wird funktionieren.
PerlProfi
 2007-03-27 16:50
#46220 #46220
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Das stimmt so nicht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
use strict;
use warnings 'all';
use Tk;

# MainWindow erzeugen
my $mw = tkinit();

# Buttons erzeugen
for my$i (1..10)
{
$mw->Button(-text => $i, -command => sub { func($i) })->pack(-fill => "x");
}

# event loop starten
MainLoop;

# aktuelles $i ausgeben
sub func { print "@_\n" }

Gibt die jeweils richtige Zahl aus.
Das liegt daran, dass die anonyme Funktion in jedem Schleifendurchlauf erzeugt wird.

MfG
Sucher
 2007-03-27 16:58
#46221 #46221
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
So funktioniert es natürlich, weil du in jedem Schleifendurchlauf einen neuen SCALAR in $i erzeugst, der in deiner sub eingefroren wird. Das macht der OP aber gerade nicht!
Das $i wird nicht neu erzeugt, sondern es ist in jedem Schleifendurchlauf die gleiche Variable. Und deshalb habe ich geschieben

*Im gegebenen Beispiel* macht das einen Unterschied, und nur die erste Variante wird funktionieren.
PerlProfi
 2007-03-27 17:17
#46222 #46222
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Stimmt, haste recht, mein Fehler.
<< >> 6 Einträge, 1 Seite



View all threads created 2007-02-13 21:28.