Seite 1 von 1
internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 19:40
von stefanxfg
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
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 20:16
von Sirius3
@stefanxfg: aus Deiner Erklärung werde ich nicht wirklich schlau. Was meinst Du mit "senden"? Kannst Du ein konkretes Problem, vielleicht mit Code posten?
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 20:33
von stefanxfg
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?
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 20:49
von Sirius3
@stefanxfg: was ist aber der Zweck des ganzen? Ein Dateiobjekt benutzt man nicht, um an anderer Stelle irgendwelche Zustandsänderungen abzufragen. Daher, was willst Du eigentlich machen?
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 21:43
von stefanxfg
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.
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 22:13
von Sirius3
@stefanxfg: Du hast eine Funktion, die eine Datei einliest und eine Liste zurückgibt. Mit dieser Liste rufst Du eine andere Funktion auf, die eine Tabelle zur Darstellung füllt. Wo brauchst Du da noch Prüfungen?
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Dienstag 26. September 2017, 22:19
von __deets__
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/
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Freitag 29. September 2017, 21:56
von stefanxfg
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.
Re: internes Objekt in der GUI bei neue Datei
Verfasst: Freitag 29. September 2017, 22:57
von __deets__
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.