internes Objekt in der GUI bei neue Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

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
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@stefanxfg: aus Deiner Erklärung werde ich nicht wirklich schlau. Was meinst Du mit "senden"? Kannst Du ein konkretes Problem, vielleicht mit Code posten?
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

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?
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

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.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

@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?
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

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/
stefanxfg
User
Beiträge: 85
Registriert: Sonntag 2. April 2017, 14:11

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.
__deets__
User
Beiträge: 14523
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten