Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5163[/thread]

Tk-Callbacks: Parameter verschwinden

Leser: 1


<< >> 6 Einträge, 1 Seite
FIFO
 2006-03-05 20:05
#45281 #45281
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hallo, hab ein blödes Problem:

Code: (dl )
1
2
3
4
5
6
7
8
...
my $edit_window = $main_window->Toplevel();
my $edit_action = $edit_window->Frame()->pack();

my $edit_SaveCopyButton = $edit_action->Button(
-text => 'Kopie Speichern',
-command => [\&SaveRecord,'copy'],
);

und später:

Code: (dl )
$edit_window->bind('<Control-s>' => [\&SaveRecord, 'copy']);


Der Parameter 'copy' wird an die sub (SaveRecord) nur per Tasten-Event (Ctrl-S) weitergegeben, nicht aber beim Klick auf den Button, hier wird die sub ohne Argument aufgerufen.

Weiß jemand Rat? Die callbacks müssten eigentlich gleich sein !?

Gruß und Danke,
FIFO
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
ptk
 2006-03-05 20:42
#45282 #45282
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bist du sicher? Ich habe es gerade mit Tk800 und Tk804 getestet, und es läuft wie erwartet.
FIFO
 2006-03-05 20:57
#45283 #45283
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Ja, ich lass mir den Parameter ($_[1]) in der sub ausgeben, und im ersten Fall bleibt er undef.
System: Sinnlos XP, ActivePerl 5.8.6, Tk 8.04

Ich probier's mal auf ner anderen Installation ...
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
FIFO
 2006-03-05 21:21
#45284 #45284
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hier mal eine Minimalversion als Komplettskript:

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
# callbacktest.pl

use strict;
use warnings;
use Tk;

my $label;

sub c_test {
$label->configure(-text => $_[1]);
}

my $mw = MainWindow->new();

my $button = $mw->Button(
-text => 'Ctrl-S',
-command => [\&c_test,'Hallo'],
);

$label = $mw->Label(-background => '#FFFFFF');

$mw->bind('<Control-s>' => [\&c_test,'Hallo']);

$label->pack();
$button->pack();

MainLoop;
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
ptk
 2006-03-05 21:44
#45285 #45285
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Bei mir steht der Parameter in $_[0].
FIFO
 2006-03-05 22:04
#45286 #45286
User since
2005-06-01
469 Artikel
BenutzerIn

user image
Hey! Das war's: Bei bind-callbacks ist der erste Parameter eine implizite Objektreferenz, also steht 'Hallo' hier in $_[1].

Beim Callback im widget-command ist das aber nicht so: hier ist 'Hallo' tatsächlich in $_[0]!

Das Problem hatte ich vor Jahren schonmal, hab's total vergessen ;-)

Danke für's Stichwort!

Quote
... in fact, Tk implicitly passes the bound widget reference as the first argument to the callback , adding any of our explicit arguments afterwards. (Mastering Perl/Tk, S. 364)
\n\n

<!--EDIT|FIFO|1141590300-->
Everyone knows that debugging is twice as hard as writing a program in the first place. So if you're as clever as you can be when you write it, how will you ever debug it? -- Brian Kernighan: "The Elements of Programming Style"
<< >> 6 Einträge, 1 Seite



View all threads created 2006-03-05 20:05.