wieder mal was zum thema namensraum...

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
Gast

hallo zusammen,

einige haben sicher mal einen blick auf diese anwendung von mir geworfen:
http://www.python-forum.de/viewtopic.php?t=3064

nun bastel ich wieder an einem update. was kommt? hat die datenbank mehr als eine tabelle, kann man über ein menu die tabellen wechseln, im hauptfenster werden dann die aktuellen datensätze angezeigt.

für jede tabelle könne alle funktionen, eingabe, bearbeiten usw. aufgerufen werden.

nun muss ich etwas verhindern. stellen wir uns vor tabelle1 ist geladen, das eingabefenster ist offen, für tabelle1 können die datensätze a,b,c,d eingegeben werden.

ich wechsel auf tabelle2, und genau hier müssen alle fenster, wie z.b. das eingabefenster der tabelle1 zerstört werden., das hauptfenster wird lediglich angepasst

die fenster werden z.b. so aufgerufen vom HauptFenster aus:

Code: Alles auswählen

        b_4=Button(self.root,width=self.b,text="Eingabe",
                        command=lambda:
                        EingabeFenster
                        (self.root,self.database,
                         self.db_table,
                         self.root.winfo_width()))

mir ist net ganz klar, wie ich prüfen kann, ob eine instanz von EingabeFenster existiert, ob es offen ist und wie ich es ggf. schliessen kann.

vielen dank im voraus,

rolgal
Gast

hallo rolgal,

heute die lösung von dir selbst :D

also, falls es überhaupt nachvollziehbar war,

am anfang wird eine instanz von HauptFenster aufgerufen, die steht im globalen namensraum.

von der klasse EingabeFenster werden eben anonyme instanzen aufgerufen (s.o.)
im konstruktor dieser klassen erfolgt die anweisung

Code: Alles auswählen

ef=self
global ef
wird eine tabelle in der auswahl (eigenes fenster) aufgerufen, wird eine methode zur abänderung der instanz der klasse HauptFenster aufgerufen, zuvor wird aber folgendes geprüft:

Code: Alles auswählen

        if isinstance(ef, EingabeFenster):
            ef.root.destroy()
und dann peng und das ef der zuletzt verwendeten tabelle ist weg, :D

ich denke um

Code: Alles auswählen

global ef
kommt man nicht rum.

oder wie seht ihr das?

mfg

rolgal
Gast

nein, nein, das muss doch anders sein,...

der user könnte ja, sinnloser weise mehrere eingabefenster oder suchfenster für die aktuelletabelle aufmachen, weiters nicht schlimm, allerdings wird bei der letzten lösung dann nur das letzte fenster zerstört, also mach ich es jetzt so:

die entsprechenden klassen bekommen eine klassenvariable:

Code: Alles auswählen

instancelist=[]
am ende des konstruktors wird die aktuelle instanz hinzugefügt:

Code: Alles auswählen

EingabeFenster.instancelist.append(self)
und der test beim wechsel der tabelle lautet nun so:

Code: Alles auswählen

        for inst in EingabeFenster.instancelist:
            if isinstance(inst, EingabeFenster):
                inst.root.destroy()
doch keine globalen variablen nötig und hat ausserdem den vorteil dass ich nicht prüfen muss ob die variable (instanz) gesetzt ist

güße

rolgal
BlackJack

Wozu ist `isinstance()` nötig?
Gast

hi blackjack,

stimmt, wozu eigentlich? werde ich gleich ausprobieren, aber du hast wohl sicherlich recht,

danke,

rolgal
Antworten