Klasse von Canvas ableiten
Klasse von Canvas ableiten
am 09.11.2006 12:24:01 von KWittrock
Hallo NG,
ich baue ein Megawidget, das auf einem Canvas aufbaut:
| package Eieruhr;
|
| use Tk::widgets 'Canvas';
| use base qw(Tk::Derived Tk::Canvas);
|
| use strict;
| use warnings;
| use Math::Trig;
|
| Construct Tk::Widget 'Eieruhr';
Ich definiere eine Klassenbindung:
| sub ClassInit {
| my ($class, $mw) = @_;
|
| $class->SUPER::ClassInit($mw);
| $mw->CanvasBind($class, '' =>
| [\&_move_hand, Ev('x'), Ev('y')]);
| }
Das bringt die Fehlermeldung
| Use of inherited AUTOLOAD for non-method Eieruhr::Ev() is deprecated
| at Eieruhr.pm line 24.
| Failed to AUTOLOAD 'Eieruhr::Ev' at E:\Klaus\Perl\Eieruhr\eieruhr.pl
| line 11
Ich ersetze Ev('x') durch $Tk::event->x. Meine Bindung wird zu
| $mw->CanvasBind($class, '' => \&_move_hand);
und die Fehlermeldung lautet jetzt
| Assuming 'require Tk::CanvasBind;' at E:\Klaus\Perl\Eieruhr\eieruhr.pl
| line 11
| Can't locate Tk/CanvasBind.pm in @INC (@INC contains: E:/Perl/lib
| E:/Perl/site/lib .) at E:/Perl/site/lib/Tk/Widget.pm line 270.
| at E:\Klaus\Perl\Eieruhr\eieruhr.pl line 11
Ich ändere die Bindung zu
| $mw->bind($class, '' => \&_move_hand);
und alles funktioniert wie gewünscht. Aber Ev() kann ich nach wie vor nicht
verwenden (die AUTOLOAD-Fehlermeldung von oben):
| $mw->bind($class, '' => [\&_move_hand, Ev('x'), Ev('y')]);
Ok, mein Kode läuft jetzt. Trotzdem hätte ich gern gewusst, was ich
eigentlich falsch gemacht habe. Warum erbt meine Klasse die Methode
CanvasBind nicht, und wieso kann ich Ev() nicht benutzen?
Gruß
Klaus
Re: Klasse von Canvas ableiten
am 09.11.2006 20:17:08 von Slaven Rezic
"K. Wittrock" writes:
> Hallo NG,
>
> ich baue ein Megawidget, das auf einem Canvas aufbaut:
> | package Eieruhr;
> |
> | use Tk::widgets 'Canvas';
> | use base qw(Tk::Derived Tk::Canvas);
> |
> | use strict;
> | use warnings;
> | use Math::Trig;
> |
> | Construct Tk::Widget 'Eieruhr';
>
> Ich definiere eine Klassenbindung:
> | sub ClassInit {
> | my ($class, $mw) = @_;
> |
> | $class->SUPER::ClassInit($mw);
> | $mw->CanvasBind($class, '' =>
> | [\&_move_hand, Ev('x'), Ev('y')]);
> | }
>
> Das bringt die Fehlermeldung
> | Use of inherited AUTOLOAD for non-method Eieruhr::Ev() is deprecated
> | at Eieruhr.pm line 24.
> | Failed to AUTOLOAD 'Eieruhr::Ev' at E:\Klaus\Perl\Eieruhr\eieruhr.pl
> | line 11
Hier musst du Tk::Ev statt Ev schreiben, oder Ev importieren, z.B. mit
import Tk 'Ev';
>
> Ich ersetze Ev('x') durch $Tk::event->x. Meine Bindung wird zu
> | $mw->CanvasBind($class, '' => \&_move_hand);
>
> und die Fehlermeldung lautet jetzt
> | Assuming 'require Tk::CanvasBind;' at E:\Klaus\Perl\Eieruhr\eieruhr.pl
> | line 11
> | Can't locate Tk/CanvasBind.pm in @INC (@INC contains: E:/Perl/lib
> | E:/Perl/site/lib .) at E:/Perl/site/lib/Tk/Widget.pm line 270.
> | at E:\Klaus\Perl\Eieruhr\eieruhr.pl line 11
>
> Ich ändere die Bindung zu
> | $mw->bind($class, '' => \&_move_hand);
CanvasBind ist nur für Tk::Canvas definiert, aber hier verwendest du
ja $mw, also ein Tk::MainWindow als Objekt. CanvasBind existiert ja
nur, damit zwischen Tk::bind() und Tk::Canvas::bind() unterschieden
werden kann.
Gruß,
Slaven
--
Slaven Rezic - slaven rezic de
tknotes - A knotes clone, written in Perl/Tk.
http://ptktools.sourceforge.net/#tknotes
Re: Klasse von Canvas ableiten
am 10.11.2006 12:27:25 von KWittrock
"Slaven Rezic" schrieb im Newsbeitrag
news:8764doe8gb.fsf@biokovo.herceg.de...
> "K. Wittrock" writes:
>
>> ............
>> Ich ändere die Bindung zu
>> | $mw->bind($class, '' => \&_move_hand);
>
> CanvasBind ist nur für Tk::Canvas definiert, aber hier verwendest du
> ja $mw, also ein Tk::MainWindow als Objekt. CanvasBind existiert ja
> nur, damit zwischen Tk::bind() und Tk::Canvas::bind() unterschieden
> werden kann.
Ok, ist klar. Danke schön.
Klaus
Re: Klasse von Canvas ableiten
am 10.11.2006 17:40:08 von KWittrock
"Slaven Rezic" schrieb im Newsbeitrag
news:8764doe8gb.fsf@biokovo.herceg.de...
> "K. Wittrock" writes:
>
>> ...................
>> Ich definiere eine Klassenbindung:
>> | sub ClassInit {
>> | my ($class, $mw) = @_;
>> |
>> | $class->SUPER::ClassInit($mw);
>> | $mw->CanvasBind($class, '' =>
>> | [\&_move_hand, Ev('x'), Ev('y')]);
>> | }
>>
>> Das bringt die Fehlermeldung
>> | Use of inherited AUTOLOAD for non-method Eieruhr::Ev() is deprecated
>> | at Eieruhr.pm line 24.
>> | Failed to AUTOLOAD 'Eieruhr::Ev' at E:\Klaus\Perl\Eieruhr\eieruhr.pl
>> | line 11
>
> Hier musst du Tk::Ev statt Ev schreiben, oder Ev importieren, z.B. mit
>
> import Tk 'Ev';
Richtig, das "use Tk;" im Hauptprogramm exportiert Ev in das Main-Package.
Vielen Dank.
Klaus