Hallo,
ich stelle jetzt wahrscheinlich eine banale Frage, aber ich weiß halt nicht, wie ich das händeln muss. Wenn man eine Datei öffnet, dann kann man das in einem Objekt speichern z.B. self.fname oder nur fname. Dieses sende ich auch an andere Toplevels, die dieses verwenden, um z.B. die GUI oder das Toplevel füllen.
Was passiert nun, wenn man eine neue Datei in der GUI anlegen möchte. Dann kennen doch die Toplevels dieses Objekt nicht. fname = None bringt mich nicht weiter. Oder doch und ich muss bei None dann darauf reagieren?
Grüße von Stefan
internes Objekt in der GUI bei neue Datei
Ich wollte nur sagen, dass ich bei einer Datei, die ich öffne, ein internes Objekt mit der Referenz zur Datei belege. Dieses benutze ich, um an anderer Stelle abzufragen, ob es eine Datei gibt.
Aber bei einer neuen Datei gibt es ja keine gespeicherte Datei. Demnach kann ja dann auch die Abfrage, ob es eine Objektreferenz gibt, nur mit negativ ausgegeben werden.
Daher denke ich, man muss das mit einer interen Objektreferenz machen oder? Aber wie?
Aber bei einer neuen Datei gibt es ja keine gespeicherte Datei. Demnach kann ja dann auch die Abfrage, ob es eine Objektreferenz gibt, nur mit negativ ausgegeben werden.
Daher denke ich, man muss das mit einer interen Objektreferenz machen oder? Aber wie?
Ich frage ab, ob eine Datei eingelesen worden ist. Wenn ja werden dann Tabellen abhängig von den Daten gefüllt. Bzw. es wird im Toplevelauf die Datei direkt zugegriffen um die Tabelle zu füllen. Daher dachte ich mir das abzuprüfen, ob überhaupt Daten zur Verfügung stehen, welche eingelesen werden sollen.
Dazu benutzt man üblicherweise einen Model-View-Controller Ansatz. Das Model deiner Anwendung enthält die Daten, die dargestellt und bearbeitet werden sollen. Wenn du keine Datei geöffnet hast, ist das Modell leer. Aber es ist immer noch ein existierendes Objekt, und die GUI-Logik greift darauf zu. Wenn dann eine bestehende Datei geöffnet werden soll, lädt das Modell die Daten ein, und benachrichtig die GUI ‚ich hab neue Daten‘.
Es gab hier im Forum zum Thema MVC schon viele Diskussionen. Einfach mal stöbern. Ein nicht brillantes aber okes Beispiel ist zb das hier: https://makeapppie.com/2014/05/23/from- ... r-tkinter/
Es gab hier im Forum zum Thema MVC schon viele Diskussionen. Einfach mal stöbern. Ein nicht brillantes aber okes Beispiel ist zb das hier: https://makeapppie.com/2014/05/23/from- ... r-tkinter/
Soweit ich den MVC verstanden habe, ist das die von Alfons Mittelmeyer mehrfach aangesprochene Taktik der Trennung zwischen GUI und Code. Dies ist bei mir über die gesamte GUI hin durchgezogen.
Bei Button-Press "neue Datei" wird bei mir das Objekt self.fname = None erzeugt. Bei Button-Press "Datei öffnen" wird eine Datei in das Objekt self.fname hineingeladen.
Ich frage später noch ab: if self.fname: und wenn hier None steht, bekomme ich einen Fehler. Vielleicht ist es dann besser auf "not None" abzufragen.
Bei Button-Press "neue Datei" wird bei mir das Objekt self.fname = None erzeugt. Bei Button-Press "Datei öffnen" wird eine Datei in das Objekt self.fname hineingeladen.
Ich frage später noch ab: if self.fname: und wenn hier None steht, bekomme ich einen Fehler. Vielleicht ist es dann besser auf "not None" abzufragen.
Nein. Genau dieses Missverständnis ist eine der Gründe warum Alfons Ansätze hier wenig Anklang gefunden haben.
Wie ich das meine habe ich die Tage hier dargestellt:
viewtopic.php?f=18&t=41314&p=315730#p315692
Wenn du das Kommando neue Datei dort ins Modell einbaust, so das es einfach alle gesetzten IntVar Objekte auf 0 setzt, hast du ein Beispiel dafür wie ich das machen würde.
Der Vorteil besteht darin, dass du das Modell NICHT auf None setzt, so das du wiederum nicht an x stellen im Code darauf prüfst. Sondern die Daten einfach reinitialsiert werden.
In tkinter kommt man damit nur so weit. Es beherrscht leider zb keine ListModelle. Oder gar Bäume. In Qt gibt es genau diese Dinge.
Wie ich das meine habe ich die Tage hier dargestellt:
viewtopic.php?f=18&t=41314&p=315730#p315692
Wenn du das Kommando neue Datei dort ins Modell einbaust, so das es einfach alle gesetzten IntVar Objekte auf 0 setzt, hast du ein Beispiel dafür wie ich das machen würde.
Der Vorteil besteht darin, dass du das Modell NICHT auf None setzt, so das du wiederum nicht an x stellen im Code darauf prüfst. Sondern die Daten einfach reinitialsiert werden.
In tkinter kommt man damit nur so weit. Es beherrscht leider zb keine ListModelle. Oder gar Bäume. In Qt gibt es genau diese Dinge.