/me hat geschrieben: Das ist definitiv seltsam.
Warum ist denn das seltsam? Wenn der Rückgabewert für das Element - z.B. ID noch nicht gesetzt wurde, dann ist der Wert noch nicht gesetzt und ich kann ihn nicht aus versehen für eine weitere Operation verwenden.
Wenn Du eine bessere Möglichkeit hättest, wie würdest Du sie denn lösen? Würde es einen struct-Befehl wie in C geben, dann könnte ich mir selber schön einen Datensatz basteln und den in ein Array packen. Geht ja hier aber nicht. Also muss ich mir mittels Klasse ein Ersatzkonstrukt erzeugen. Ich stehe grade mächtig auf einem Schlauch - nicht ein Wasserschlauch, sondern Schlauch steht hier für den Ausdruck eines Problems, dass es zu bewältigen gilt. Das Problem ist, wie transportiere ich Informationen zwischen unterschiedlichen Klassen hinauf und herunter.
Ich habe jetzt ein Programmentwurfsmuster, dass aus mehreren Dateien/Klassen besteht. Ganz oben in der Hirachie steht eine Chef-Klasse - gewissermassen eine Wurzel. Mein Programm hat jetzt mehrere Aufgaben zu erfüllen, deshalb gibt es mehrere Klassen für die Aufgaben, die dann von der Chef-Klasse aufgerufen werden. Eine Kommunikation findet nur im direkten Strang statt. Aufgabenklasse A kommuniziert nicht mit Aufgabenklasse B, sondern nur über die Chef-Klasse.
Folgendes Beispiel:
Ein Programm holt Messwerte von drei Thermometern. Die Messwerte sollen in Diagrammen dargestellt werden. Jedes Diagramm hat spezifische Funktionen. Es gibt daneben eine Hauptbedienleite, um das Programm zu beenden, eine Messung zu starten ... .
Die Hauptklasse steuert alles - also ein HauptController - das ist die root-Klasse. Dann gibt es eine Klasse, die die Anzeige steuert. Die Anzeigeklassen besteht wieder aus Unterelementen - ein Anzeige (Frame) für die Hauptbuttons und Frames für die einzelnen Plots. Dann gibt es eine weitere Klasse, die Daten aus dem Messfühler holt.
class MainController ---> class MainView
---> class GetData
class MainView ---> class PlotView1
---> class PlotView2
---> class ButtonView
in Mainview erzeuge ich Frames für jeden Bereich, den ich an die Unterklasse übergebe
class Mainview ()
def __init__(self, master)
self.plot1frame = tk.Frame(master)
self.buttonframe = tk.Frame(master)
buttonview = ButtonView(master)
In ButtonView lege ich fest, wie die einzelnen Buttons angeordnet werden (z.B. mit der Pack- oder der Grid-Methode).
ABER - in Maincontroller befindet sich z.B. die Information, wie das Programm beendet wird - dort gibt's die Funktion do_exit, die die mainloop beendet und darauf reagieren soll, wenn ich den Button Beenden drücke.
Also muss ich irgendwie die Informationen über die Buttons vom MainController zum ButtonView transportieren. Dazu erzeuge ich mir im MainController ein Button-Element aus der Button-Klasse und schleuse das von der Wurzel bis zum Ende hin durch:
MainController:
buttons=Buttons()
Dort will ich die Buttons definieren, z.B. die Namen und auch die Info, dass die Funktion do_exit aufgerufen werden soll. Und wenn ich viele Buttons habe, dann muss ich viele Informationen durchschleusen, darum wollte ich das in Form einer Klasse lösen, wo ich alle wichtigen Informationen zu den Buttons speichere und dann in jedem Strang verfügbar habe. Ich übergebe also Buttons bei jedem Aufruf
MainController():
root = tk.Tk()
buttons = Buttons()
MainView(root, buttons)
MainView():
ButtonView(self.buttonframe, buttons).
Und in ButtonView kann ich dann mit den Befehlen grid/pack die Buttons anordnen und über Options die Optionen wie Schriftart, Größe, Breite, Farbe ... übergeben.
Aber Options wie "command=" muss ich ja im MainController übergeben, weil die Funktion do_exit im MainController vorhanden ist, da dort auch die Funktion root.mainloop gestartet wird. Ich könnte also entweder den Zeiger für die Funktion durchschleusen, was ich aber unpraktisch halte - drum habe ich mich entschieden, eine Datenklasse Buttons zu erstellen, um die nötigen Informationen zu den Buttons durch alle Ebenen hindurchschleusen kann. Und genauso soll es später auch für andere Anzeigedinger sein - wie die Hakekästchen und so.
Hast Du eine bessere Idee?