Seite 1 von 1

Probleme mit Toplevel

Verfasst: Donnerstag 15. Februar 2007, 22:09
von Lambert
Hallo,

Ich hab da leider noch immer ein kleines Problem. Und zwar: Ich habe folgendes Programm:

Code: Alles auswählen

from Tkinter import *

class VIEW:
    def __init__(self):
        self.master=Tk()
        self.items=["Eins", "Zwei"]
        self._widgetsListbox()
        self._start()
        self.master.mainloop()

    def _widgetsListbox(self):
        self.listbox=Listbox(self.master, selectmode=SINGLE)
        self.listbox.grid(row=0, column=0, rowspan=len(self.items))        

    def _start(self):
        self._fillBox()
        self.listbox.bind("<ButtonRelease-1>", self._klick)

    def _fillBox(self, value=NONE):
        for item in self.items[:]:
            self.listbox.insert(END, item)

    def _klick(self, event=NONE):
        self.master.update()
        number=self.listbox.curselection()
        if self.listbox.get(int(number[0]))=="Eins":
            self.listbox.delete(int(number[0]))
            self.A=VIEW_ADDRESS(self.master, self.listbox)
            self.master.update()
        elif self.listbox.get(int(number[0]))=="Zwei":
            self.listbox.delete(int(number[0]))
            self.B=VIEW_WWW(self.master, self.listbox)
            self.master.update()

            

class VIEW_WWW:
    def __init__(self, master, listbox):
        self.textvar = StringVar()        
        self.master=master
        self.fenster=Toplevel()
        self.fenster.title("Zwei")
        self.master.wait_window(self.fenster)
        self._refresh(listbox)

    def _refresh(self, listbox):
        listbox.insert(END, "Zwei")

    
        
        
class VIEW_ADDRESS:
    def __init__(self, master, listbox):
        self.textvar = StringVar()        
        self.master=master
        self.fenster=Toplevel()
        self.fenster.title("Eins")
        self.master.wait_window(self.fenster)
        self._refresh(listbox)

    def _refresh(self, listbox):
        listbox.insert(END, "Eins")

    

if __name__=="__main__":
    A=VIEW()
    A.start()
Wenn man auf einen Eintrag klickt funktioniert alles wie es soll. Also beim schließen des Fensters taucht der entsprechende Eintrag wieder in der Listbox auf. Wenn man beide Einträge anklickt öffnen sich auch zwei Fenster. Das ist auch bezweckt. Aber wenn man die Fenster dann in umgekehrter Reihnfolge wieder schließ, tauchen die Einträge in der Listbox erst auf wenn beide Fenster geschlossen sind.
Fällt da jemandem eine Möglichkeit ein wie die Einträge wirklich mit dem Schließen zusammen wieder auftauchen?

Gruß
lambert

Verfasst: Donnerstag 15. Februar 2007, 23:51
von Mawilo
Um eine Funktion beim Schließen des Fensters aufzurufen, habe ich die Funktion close zugefügt. Diese wird auch an den WindowManager gebunden.

Code: Alles auswählen

self.fenster.wm_protocol('WM_DELETE_WINDOW',self.close)
Das hat den Vorteil, dass du diese Funktion auch mit einem Button aufrufen kannst.

Dein Beispiel habe ich etwas abgeändert:

Code: Alles auswählen

from Tkinter import * 

class VIEW: 
    def __init__(self): 
        self.master=Tk() 
        self.items=["Eins", "Zwei"] 
        self._widgetsListbox() 
        self._start() 
        self.master.mainloop() 

    def _widgetsListbox(self): 
        self.listbox=Listbox(self.master, selectmode=SINGLE) 
        self.listbox.grid(row=0, column=0, rowspan=len(self.items))        

    def _start(self): 
        self._fillBox() 
        self.listbox.bind("<ButtonRelease-1>", self._klick) 

    def _fillBox(self, value=NONE): 
        for item in self.items[:]: 
            self.listbox.insert(END, item) 

    def _klick(self, event=NONE): 
        self.master.update() 
        number=self.listbox.curselection() 
        self.A=VIEW_WWW(self.master, self.listbox, 
                                        self.listbox.get(int(number[0]))) 
        self.listbox.delete(int(number[0]))
        self.master.update() 
        

class VIEW_WWW: 
    def __init__(self, master, listbox, value): 
        self.textvar = StringVar()        
        self.master=master 
        self.listbox = listbox
        self.value = value
        self.fenster=Toplevel() 
        self.fenster.title(self.value) 
        self.fenster.wm_protocol('WM_DELETE_WINDOW',self.close)

    def _refresh(self): 
        self.listbox.insert(END, self.value) 
    
    def close(self):
        self._refresh()
        self.fenster.destroy()

if __name__=="__main__": 
    VIEW()._start() 
Stephan

Verfasst: Donnerstag 15. Februar 2007, 23:55
von Lambert
Super. Danke schön.

Gruß
lambert