Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl Tk -command



Molaf
05-12-2008, 13:11
Hallo alle miteinander,

ich habe grade Ladehemmnungen, ich komme einfach nicht darauf, wo mein Fehler liegt.

Ich wollte eigentlich nur wieder schnell ein kleines Progrämmchen für die Arbeit schreiben, inzwischen hänge ich hier schon seeehr lange dran fest (wie lange schreibe ich nicht, wer weiß, wer das hier mal zu lesen kriegt :) ).

Das Programm enthält einige Buttons, welche mit einem einzigen Buchstaben beschriftet sind, und wenn gedrückt, rufen sie alle die selbe Subfunktion auf und übergeben jeweils den Buchstaben der Funktion, damit die unterschiedlich reagieren kann.

Ohne Parameter lautet die Syntax:


$mw->{parent}->Button(-text=>"Beschriftung", -command=>\&subfkt )->pack;

sub subfkt {
#blah
}

Mein bisheriges Skript sieht so aus:

#!/usr/bin/perl

use strict;

use XML::Simple;

use Tk;
use Tk::Tiler;

my $mw;

my @liste = qw(a b c d e f g);

$mw->{main} = new MainWindow;
$mw->{icons} = $mw->{main}->Tiler( -columns=>2, -rows=>(int(@liste/2)+1) )->pack( -side=>'left' );

my @L;
foreach (@liste)
{push( @L,
$mw->{icons}->Button(
-text => $_,
-command => sub { print "+$_\n";
subfkt($_);}
)
);
}

$mw->{icons}->Manage(@L);

MainLoop;

sub subfkt {
my $name = shift;
print "-$name\n";
}

Sowohl das print in der Funktion hinter dem command gibt nur ein +\n als auch das print in der eigentlichen Subfunktion, die dann ein -\n schreibt. Der Parameter wird einfach nicht mit übergeben, bzw. geht irgendwo bei der Funktionsübergabe flöten.


Die Zeile der Schleife sah vorher so aus:

{$mw->{icons}->Button(
-text=>$_,
-command=>\&subfkt($_)
);
Dann werden aber die Aufrufe komischerweise bei der Generierung der Oberfläche schon aufgerufen, bei Button-Betätigung gibts denn aber Fehler.

Kapsele ich den Funktionsaufruf nochmal in geschweifte Klammern, werden bei Initialisierung keine Funktionen aufgerufen, beim Klicken wird dann aber wieder die Funktion ohne Parameter aufgerufen.

$mw->{icons}->Button(
-text=>$_,
-command=>\&{ sub {subfkt($_)} }
);

Offenbar will mir die korrekte Vorgehensweise nicht einfallen, für das richtige Stichwort wäre ich dankbar.

Molaf

Molaf
05-12-2008, 14:36
Die besten Fragen sind doch die, welche sich selber beantworten ...

In TK::callbacks gefunden:

-command=>[\&subfkt, $param1, ... ]

Scheint eine Besonderheit von Tk zu sein.