Font
[thread]5129[/thread]

Tk: Document-View Architektur?: GUI Konzept...



<< |< 1 2 >| >> 19 entries, 2 pages
BratHering
 2005-11-15 15:47
#44987 #44987
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Hallo!

Mittlerweile darf ich behaupten, dass ich schon so einiges an Anwendungen (Perl/Tk) auf die Beine gestellt habe. Aber irgendwie ist das alles was ich bisher gemacht habe sehr amateurhaft.

Ich will damit sagen, ich habe kein wirkliches Konzept nach dem ich eine GUI Anwendung baue. Consolenanwendungen hingegen sind sehr einfach, denn da läuft alles stukturiert von oben nach unten ab. Um eine GUI mit Funktionen zu machen ist eine gewisse Ordnung wünschenswert.

In der C++ Welt nennt sich sowas "Document-View-Architektur", dabei sind die GUI und das eigentliche Programm (die Funktionen) auf eine bestimmte Struktur gebracht und so sauber von einander getrennt (allerdings funktioniert das alles auf Basis von unzähligen Pointern :-$ ). Dadurch ist es aber möglich ein und das selbe Programm auf verschiedene GUIs zu portieren.

Also was gibt es denn in der Perl/Tk Praxis-Welt für Konzepte, um die GUI von den eigentlichen Funktionen sauber trennen zu können?


MfG
BratHering
Strat
 2005-11-15 17:19
#44988 #44988
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
selbst ist der mann/die frau...

die funktionalitaet von gui schoen kapseln (z.B. in Module) und sich selbst Zugriffsmethoden auf die GUI spezifische funktionalitaet schreiben. wenn man dann auch den rest schoen gekapselt hat, duerfte das eigentlich recht einfach gehen...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
BratHering
 2005-11-15 17:27
#44989 #44989
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Genau das ist mein Problem, ich habe keine richtige Idee. :) Ich dachte nur es gäbe unter den professionelleren Usern etwas allgemeines.

Könntest Du mir vielleicht ein kleines Beispiel geben wie Du so etwas realisieren würdest? Eine art verbale ;) Skizze wie Tk GUI und der eigentliche Funktionsumfang gekapselt werden sollten?


MfG
BratHering
 2005-11-15 17:40
#44990 #44990
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Bisher habe ich mir so etwas ausgedacht, bitte um Meinung dazu: :)

Das Main-Skript enthält die Tk-GUI sowie Tk-Callbacks, die auf Funktionen der externen Module zugreifen. In den externen Modulen sind die eigentlichen Programmfunktionen, die nichts mit der GUI zu tun haben sondern mit dem "Dokument" selbst (eventuell noch weitere Klassen als externe Module vorhanden).

Im Main-Skript habe ich eine einzige Variable (die nicht zur GUI gehört) genannt "$document", die eine Referenz ist auf den eigentlichen Programminhalt. Die Funktionen der externen Module werden über Tk-Callbacks aufgerufen und bearbeiten den Inhalt von "$document". Die GUI ist somit nur noch dafür da erstens über die Callbacks Funktionen der externen Module aufzurufen (die "$document" bearbeiten) und zweitens sich zu refreshen um den Inhalt aus "$document" dem Anwender zu präsentieren.

Ich hoffe es ist verständlich was ich mir da ausgedacht habe? :) Was haltet Ihr davon?
Strat
 2005-11-15 17:41
#44991 #44991
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
dazu habe ich mal was auf Perlmonks - Re: Name spaces and Perl::Tk coding style geschrieben... vielleicht hilft dir das weiter. sonst: hier im GUI-Forum habe ich mal ein paar Wrapper fuer Tk-Objekte gepostet; sowas verwende ich bei Tk fast immer, da es ueberdies ein einheitliches Layout sehr vereinfacht und eine menge an tipperei spart\n\n

<!--EDIT|Strat|1132069301-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
BratHering
 2005-11-15 18:13
#44992 #44992
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Und wie klingt das hier? ->
[quote=BratHering,15.11.2005, 17:40]Bisher habe ich mir so etwas ausgedacht, bitte um Meinung dazu: :)

Das Main-Skript enthält die Tk-GUI sowie Tk-Callbacks, die auf Funktionen der externen Module zugreifen. In den externen Modulen sind die eigentlichen Programmfunktionen, die nichts mit der GUI zu tun haben sondern mit dem "Dokument" selbst (eventuell noch weitere Klassen als externe Module vorhanden).

Im Main-Skript habe ich eine einzige Variable (die nicht zur GUI gehört) genannt "$document", die eine Referenz ist auf den eigentlichen Programminhalt. Die Funktionen der externen Module werden über Tk-Callbacks aufgerufen und bearbeiten den Inhalt von "$document". Die GUI ist somit nur noch dafür da erstens über die Callbacks Funktionen der externen Module aufzurufen (die "$document" bearbeiten) und zweitens sich zu refreshen um den Inhalt aus "$document" dem Anwender zu präsentieren.

Ich hoffe es ist verständlich was ich mir da ausgedacht habe? :) Was haltet Ihr davon?[/quote]
BratHering
 2005-11-15 19:15
#44993 #44993
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Zufällig bin ich auf die Suchfunktion dieses Forums gestoßen, ;) *joke* und da bin ich auf diesen Strat's Beitrag gekommen: http://board.perl-community.de/cgi-bin....er#idx4

Den Code hier:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
package MyPackage::Global;
use vars qw($ThisGlobalValue);
$MyPackage::Global::ThisGlobalValue = "irgendwas";

.....
package MyPackage::Callbacks;
sub ChangeThis {
my ($widget, $index) = @_;
$MyPackage::Global::ThisGlobalValue = $widget->value($index);
}

...verstehe ich im Prinzip und finde diese Idee sogar besser als meine, werde es also mal in Zukunft so sturkturieren. :)


Aber drei Fragen hätte ich da noch:

1.) Wie macht man verschachtelte Module (z.B. MyModule::Func::Zeugs)? Bisher habe ich nur eindimensionale Module geschrieben.

2.) Wie tut man ein Tk GUI erstellen in von einem unter-Package heraus (also nicht in main, bisher hatte ich es in der Main gemacht) und wie greift man dann auf die Widgets zu?

3.) Mir ist leider noch nicht so ganz klar was genau mit Wrapper in diesem Zusammenhang gemeint ist, auch wenn ich englisch kann. :D


MfG
BratHering
Strat
 2005-11-15 19:22
#44994 #44994
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
sorry, hab's ueberlesen, weil ich nach dem posten den thread gleich geschlossen habe...

dein ansatz ist recht gut verwendbar. Nur wuerde ich dann auch noch den zweiten schritt machen und die Tk-Funktionalitaet auch noch in Module auslagern, und $::document in dieses Package rein verlagern.

Wenn du dann bei irgendwelchen Callbacks ein widget mituebergeben musst, dann kannst du das ja auch z.B. folgendermaszen machen, z.B. anstelle von
Code: (dl )
1
2
my $var = "1";
$parent->Button(-textvariable => \$var, -command => [ \&UpdateButton, $button, \$var]);

und dann in UpdateButton mit $button rumfuhrwerkst
z.B.
Code: (dl )
1
2
3
4
5
6
my $var = "1";
my $button = $parent->Button(-text => $var);
$button->configure(-command => sub {
$var = &UpdateValue($var);
$button->configure('-text' => $var)
});

oder so aehnlich arbeitest (ich weiss, das beispiel ist nicht besonders toll, da es ja -textvariable gibt)

so kannst du den Callback (wenn moeglich) moeglichst Tk-frei halten\n\n

<!--EDIT|Strat|1132075421-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
BratHering
 2005-11-15 19:47
#44995 #44995
User since
2005-04-28
155 articles
BenutzerIn
[default_avatar]
Quote
1.) Wie macht man verschachtelte Module (z.B. MyModule::Func::Zeugs)? Bisher habe ich nur eindimensionale Module geschrieben.

2.) Wie tut man ein Tk GUI erstellen in von einem unter-Package heraus (also nicht in main, bisher hatte ich es in der Main gemacht) und wie greift man dann auf die Widgets zu?

3.) Mir ist leider noch nicht so ganz klar was genau mit Wrapper in diesem Zusammenhang gemeint ist, auch wenn ich englisch kann.


Ok, danke. :)

Nur ist mir noch nicht ganz klar wie Tk in einem Modul auszusehen hat und wie es aufgerufen wird (etwa genauso wie im Main? (Wo ist dann die mainLoop; ?)). :( Welche Funktion hat dann das Main-Package?

Kann man in Modulen wie in Main einfach Variablen ablegen? Bisher hatte ich in Modulen nur Funktionen abgelegt.

Und wie macht man solche verschachtelten Module, wie z.B.:
Code: (dl )
1
2
3
MyApp::Functions
MyApp::GUI
MyApp::Document

...so, dass Diese drei Module in einem Package sind aber dennnoch in extra Dateien.


Sorry für die Fragen über Fragen... ;)


MfG
BratHering
Strat
 2005-11-16 17:54
#44996 #44996
User since
2003-08-04
5246 articles
ModeratorIn
[Homepage] [default_avatar]
Das mit den Modulen hat normalerweise nichts speziell mit Tk zu tun (ausser du willst die schnittstellen eines widgets veraendern: Tk::Derived, oder neue widgets zusammensetzen: Tk::Composite), sondern verhaelt sich wie allgemeine Module
z.B.
./myProgram.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
#! /usr/bin/perl
use warnings;
use strict;
use Tk;
use FindBin;
use lib $FindBin;
use MyApp::Widgets;

my $mw = MainWindow->new();
my $button = MyApp::Widgets::Button($mw, 'klick', sub { $mw->destroy() });
MainLoop();

(MainWindow->new vielleicht auch als Funktion auslagern, z.B. nach MyApp::Forms oder so)

./MyApp/Widgets.pm (das letzte hinter den :: ist der Dateiname ohne .pm)
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
34
35
36
package MyApp::Widgets;
use warnings;
use strict;

use constant BACKGROUND_COLOR => '#bfdcc0'; # als konstante
our $StandardFont = 'Arial 12 normal'; # als "globale" variable
use vars qw($BoldFont); # ebenfalls "global"
$BoldFont = 'Arial 12 normal';
my $fixedFont = "Courier 12 normal"; # oder normale my-variable

sub Button {
my ($parent, $text, $callback, %options) = @_;
my %options2 = ();
if (defined $callback and ref $callback) {
$options2{-command} = $callback;
} # if
else {
$options2{-state} = 'disabled';
}
if (ref $text) {
$options2{-textvariable} = $text;
}
else {
$options2{-text} = $text;
}

return $parent->Button(
-background => BACKGROUND_COLOR,
-font => $StandardFont,
-paddx => 5, -pady => 4,
%options2, %options,
);
} # Button
# -----------------------------------------------------
sub Frame { ... }
#...

(nicht getestet)

Auf "globale" Variablen kann man auch ueber den voll qualifizierten Packagename zugreifen, z.B. $MyApp::Widgets::StandardFont oder $MyApp::Widgets::$BoldFont; sogar auf Konstanten geht es, allerdings nur ueber einen Umweg (konstanten sind ja in Perl Subroutinen): &MyApp::Widgets::BACKGROUND_COLOR
Auf die my-Variable $fixedFont kommst du allerdings nur aus dem Modul selbst dran (d.h. nur aus untergeordneten gueltigkeitsbereichen)\n\n

<!--EDIT|Strat|1132156692-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< |< 1 2 >| >> 19 entries, 2 pages



View all threads created 2005-11-15 15:47.