Seite 1 von 1

Zustand Toplevel

Verfasst: Dienstag 17. Oktober 2017, 22:13
von Windy
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

Re: Zustand Toplevel

Verfasst: Dienstag 17. Oktober 2017, 22:20
von __deets__

Re: Zustand Toplevel

Verfasst: Dienstag 17. Oktober 2017, 23:02
von Windy
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()

Re: Zustand Toplevel

Verfasst: Dienstag 17. Oktober 2017, 23:28
von __deets__
Und die sieht wie aus? Außerdem löscht das immer noch nicht magisch deine Variable x.

Re: Zustand Toplevel

Verfasst: Mittwoch 18. Oktober 2017, 07:04
von Sirius3
@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.

Re: Zustand Toplevel

Verfasst: Mittwoch 18. Oktober 2017, 08:44
von Windy
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.

Re: Zustand Toplevel

Verfasst: Mittwoch 18. Oktober 2017, 09:09
von __deets__
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.

Re: Zustand Toplevel

Verfasst: Mittwoch 18. Oktober 2017, 09:18
von Windy
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()

Re: Zustand Toplevel

Verfasst: Mittwoch 18. Oktober 2017, 10:26
von Sirius3
@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.