User since
2005-08-29
53
Artikel
BenutzerIn
Also ich bin der Meinung, dass man Oberfläche und Funktionalität strikt trennen sollte. Dies scheint jedoch in Perl ein wenig schwierig zu werden.
Hab mir jetzt folgendes überlegt:
Ich hab ein Frame als Klasse in dem meine Oberfläche agiert.
Dieses wird per new() auf mein Fenster gepappt.
So weit so gut. Nun möchte ich sämtliche Aktionen umleiten in Variablen ($self->{porder}, $self->{pdata}). Diese wurden von außen per new als Referenz belegt. Somit hab ich eine Schnittstelle nach draußen. Jetzt muss ich im Pollingverfahren herausfinden ob eine Aktion auf das Frame stattfand.
Wie kann ich also den Mainloop so schreiben, daß mir dieses vergönnt ist?
Im Endeffekt müsste ich eine Funktion regelmäßig aufrufen, die dieses durchführt.
Edit: Es müsste eigentlich auch genügen, wenn ich auf dem übergeordneten Fenster einen Event auslösen kann..\n\n
<!--EDIT|DocJunioR|1126853203-->
User since
2003-08-04
14371
Artikel
ModeratorIn
Welche Aktionen denn??
Du kannst verschiedene Events per
bind an das Frame binden...
Edit: Hier das
entsprechende Kapitel im Tutorial...\n\n
<!--EDIT|renee|1126853298-->
User since
2005-08-29
53
Artikel
BenutzerIn
Ja, aber diese müsste ich doch dann innerhalb der Klasse abhandeln und das will ich nicht.
Oder kann ich Funktionen aufrufen, die innerhalb der Parentklasse existieren?
User since
2003-08-04
14371
Artikel
ModeratorIn
Du kannst auch Funktionen der Parentklasse aufrufen...
User since
2005-08-29
53
Artikel
BenutzerIn
ist imho auch keine saubere Lösung, aber immernoch besser als diese Wurschtelei
User since
2003-08-04
14371
Artikel
ModeratorIn
Was würdest Du denn für eine saubere Lösung halten?
User since
2005-08-29
53
Artikel
BenutzerIn
wie oben schon gesagt.
Funktion und Oberfläche müssten strikt getrennt werden.
Die Oberfläche selbst darf nur melden, was geschehen ist und die Logik im Hintergrund holt sich diesse Daten bearbeitet sie. Anschließend wird die Oberfläche aktualisiert.
User since
2003-08-04
14371
Artikel
ModeratorIn
Das kannst Du ja strikt trennen. Die Bindings machst Du bei der Oberfläche und die Funktionen, die ausgeführt werden, kannst Du in ein extra Modul packen... Viel strikter kann man es nicht machen...
User since
2003-08-04
14371
Artikel
ModeratorIn
So ähnlich könnte man es machen:
Skript:
#!/usr/bin/perl
use strict;
use warnings;
use Tk;
use lib qw(.);
use ActionListener;
my $mw = MainWindow->new();
my $label = $mw->Label(-text => 'test')->pack();
my $actionlistener = ActionListener->new();
$actionlistener->add($label);
MainLoop;
ActionListener.pm:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package ActionListener;
use Tk;
sub new{
my $self = {};
bless $self,shift;
return $self;
}
sub add{
my ($self,$widget) = @_;
$widget->Tk::bind($widget,'<Button-1>',[\&left]);
}
sub left{
print "linke Maustaste gedrückt...\n";
}
1;