Zustand Toplevel

Fragen zu Tkinter.
Antworten
Windy
User
Beiträge: 8
Registriert: Montag 17. Juli 2017, 11:45

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
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Windy
User
Beiträge: 8
Registriert: Montag 17. Juli 2017, 11:45

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()
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und die sieht wie aus? Außerdem löscht das immer noch nicht magisch deine Variable x.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Windy
User
Beiträge: 8
Registriert: Montag 17. Juli 2017, 11:45

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.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Windy
User
Beiträge: 8
Registriert: Montag 17. Juli 2017, 11:45

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()
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
Antworten