Hallo,
habe mit Tkinter wieder ein hoffentlich kleines Problemchen..
Wie kann ich prüfen ob das Toplevel-Fenster zwischenzeitlich vom Benutzer geschlossen wurde?
Hatte eigentlich gedacht, dass dieses kurze Skript zum Erfolg führt, tut es aber leider nicht.
fenster = Toplevel()
…
if fenster == None:
pass # Benutzer hat Fenster geschlossen
Danke für Eure Hilfe
Windy
Zustand Toplevel
Guckst du Doku: http://effbot.org/tkinterbook/tkinter-e ... #protocols
Kann den Hinweis leider nicht anwenden. Mein TestSkript fürt zu einer richtig heftigen Fehlermeldung...
Code: Alles auswählen
from tkinter import *
from tkinter import ttk
def klickButton():
x.protocol("WM_DELETE_WINDOW", x.destroy)
if x == None:
print('Fenster zu')
else:
print('Fenster auf')
HauptFenster = Tk()
HauptFenster.title('TopLevel')
HauptFenster.geometry('800x400')
dummi = Button(HauptFenster, text='test', command=klickButton)
dummi.place(x=100, y=100)
x = Toplevel()
x.title('dummi')
x.geometry('800x400')
HauptFenster.mainloop()
@Windy: Sternchenimporte sind böse, weil sie unkontrolliert Namen in den eignene Namensraum schaufeln. Üblicherweise wird tkinter als "import tkinter as tk" importiert. Globale Variablen machen ein Programm unwartbar. x sollte nicht einfach so in klickButton auftauchen. Was klickButton macht, ist sowieso nicht sinnvoll. Du bindest an das Fensterschließen-Event die Methode zum Fensterschließen. Variablen werden nicht auf magische Weise None. Auch ein geschlossenes Fenster hat in Python noch eine Referenz, nur kann man diese nicht mehr benutzen, weil das Gegenstück in Tk nicht mehr existiert. Daher die Fehlermeldung. Und auf diese Weise ergibt sich auch eine Methode zum Testen, ob das Fenster noch existiert.
Es handelt sich um ein TEST-Skript. Ich möchte zu einem bestimmten Zeitpunkt (hier Klick auf Button) prüfen, ob der Anwender vielleicht zwischenzeitlich ein bestimmtes Toplevel-Fenster geschlossen hat und auf dieses verhalten gesondert vom Programm her reagieren. Mit anderen Worten, möchte ich von Programmseite aus feststellen ob ein bestimmtes Toplevel-Fenster noch existiert und mit einer IF-Abfrage entsprechend reagieren.
Kannst du nicht. Du kannst das Ereignis abfangen & das Fenster selbst zerstören, und kannst dir dabei natürlich merken, das es weg ist. Du musst das Protocol also bei Anlage des Fensters registrieren.
Steht auch alles im einführenden Absatz in der von mir verlinkten Doku.
Steht auch alles im einführenden Absatz in der von mir verlinkten Doku.
Danke für Eure Hilfe, habe jetzt eine Einfache Möglichkeit gefunden:
Code: Alles auswählen
from tkinter import *
from tkinter import ttk
def klickButton():
try:
x.title('dummi')
except:
print('Fenster Weg')
else:
print('Fenster Da')
HauptFenster = Tk()
HauptFenster.title('TopLevel')
HauptFenster.geometry('800x400')
dummi = Button(HauptFenster, text='test', command=klickButton)
dummi.place(x=100, y=100)
x = Toplevel()
x.title('dummi')
x.geometry('800x400')
HauptFenster.mainloop()
@Windy: man sollte niemals nackte Excepts benutzen, hier z.B. wird ein tkinter.TclError geworfen und nur den sollte man abfangen. "x.title" ist eine schlechte Funktion zum Testen, da sie Nebeneffekte hat, wie wars mit x.state?
Sternchenimporte sind böse, weil sie unkontrolliert Namen in den eignene Namensraum schaufeln. Üblicherweise wird tkinter als "import tkinter as tk" importiert. Globale Variablen machen ein Programm unwartbar. x sollte nicht einfach so in klickButton auftauchen.
Sternchenimporte sind böse, weil sie unkontrolliert Namen in den eignene Namensraum schaufeln. Üblicherweise wird tkinter als "import tkinter as tk" importiert. Globale Variablen machen ein Programm unwartbar. x sollte nicht einfach so in klickButton auftauchen.