Probleme mit Toplevel

Fragen zu Tkinter.
Lambert
User
Beiträge: 40
Registriert: Montag 20. Februar 2006, 09:32

Probleme mit Toplevel

Beitragvon Lambert » Donnerstag 15. Februar 2007, 22:09

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
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 15. Februar 2007, 23:51

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
Lambert
User
Beiträge: 40
Registriert: Montag 20. Februar 2006, 09:32

Beitragvon Lambert » Donnerstag 15. Februar 2007, 23:55

Super. Danke schön.

Gruß
lambert

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder