Ich habe gerade eine geschrieben (~7000 Zeilen), und da habe ich den Code in mehrere Module aufgeteilt:
x) abrechnung.pl -> Hauptprogramm, macht eigentlich kaum was
x) Abr/Config.pm -> Konfiguration
x) Abr/Data.pm -> Kommunikation mit der Datenbank (in meinem Fall SQLite)
x) Abr/Navigation.pm -> ich habe eine relativ komplizierte Navigation, so eine Art erweitertes und schoeneres Tk::Notebook, und den Code habe ich hier hereingepackt
x) Abr/Forms.pm -> Hier werden die ganzen Frames und sonstige Widgets erzeugt (mit Ausnahme der Navigation)
x) Abr/Callbacks.pm -> Wenn irgendwo ein Callback auftritt (z.B. -command), dann steht der Code dazu dort.
Abr/Export.pm -> Da eine der Hauptkomponenten ein Export aus der Datenbank ist (mit vielen Konvertierungen), habe ich es in ein eigenes Modul gepackt.
x) ... und noch ein paar weitere
Nebenbei: es ist bei eigenen Modulen besser, einen Hauptnamensraum (hier Abr) zu waehlen, der nicht von irgendwelchen CPAN-Modulen verwendet werden. Und dann das Verzeichnis ./Abr, in dem die Module liegen, dann mit
use FindBin;
use lib "$FindBin::Bin";
Da viele Widgets irgendwie immer dasselbe Aussehen haben sollen, habe ich dafuer eigene Subroutinen geschrieben, die da Standardwerte setzen, z.B.
sub Label {
my ($parent, $text, %options) = @_;
$parent->Label(-text => $text, -background => &Abr::Config::BACKGROUND,
-padx => 2, -pady => 2, %options);
} # Label
# ------------------------------------------------------------
sub LabelTied {
my ($parent, $textvar, %options) = @_;
$parent->Label(-textvariable => $textvar, -background => &Abr::Config::BACKGROUND,
-padx => 2, -pady => 0, %options);
} # LabelTied
Und wenn in bestimmte Entry's nur bestimmte Werte in einer gewissen Maximallaenge eingegeben werden duerfen, kann ich dir mein Modul
Tk::EntryCheck ans Herz legen, das nur gewisse Zeichen zulaesst... (dieses Modul ist im Rahmen dieses Projektes entstanden)