Toplevel schließen ohne global

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bambam04
User
Beiträge: 3
Registriert: Sonntag 12. Mai 2019, 13:46

Hallo,
Ich versuche gerade in mein Programm ein Button zum beenden einzufügen, der ein neues Fenster erstellt, welches nochmal nachfragt ob man das Programm wirklich beenden will.
Jetzt stell ich mir nur die Frage ob ich das auch ohne "global" schaffe, da ich gelesen hab das man "global" vermeiden soll...

Code: Alles auswählen

[/from tkinter import *

def Frage(event):
    global fensterFrage
    # Erzeugung eines neuen Fensters
    fensterFrage = Toplevel(height=100, width=180)
    
    
    
    # Label mit Frage
    labelUeberschriftFrage = Label(master=fensterFrage,
                                   text="Sind Sie sich sicher?",
                                   background="white")
    labelUeberschriftFrage.place(x=5, y=5, width=190, height=20)

    # Button Ja
    buttonJa = Button(master=fensterFrage,
                      text="Ja",
                      background="white")
    buttonJa.bind("<Button-1>", Ja)
    buttonJa.place(x=40, y=35, width=40, height=40)
    

        

    # Button Nein
    buttonNein = Button(master=fensterFrage,
                        text="Nein",
                        background="white")
    buttonNein.bind("<Button-1>", Nein)
    buttonNein.place(x=100, y=35, width=40, height=40)

def Nein(event):
    global fensterFrage
    fensterFrage.destroy()

def Ja(event):
    tkFenster.destroy()

# Erzeugung des Fensters
tkFenster = Tk()
tkFenster.title("test")
tkFenster.geometry("400x260")

# Button Programm beenden
buttonProgrammBeenden = Button(master=tkFenster,
                               text="Programm beenden",
                               background="white")
buttonProgrammBeenden.bind("<Button-1>", Frage)
buttonProgrammBeenden.place(x=145, y=235, width=110, height=20)

# Aktivierung des Fensters
tkFenster.mainloop()
code]
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Alles was eine Funktion braucht, muß sie über ihre Argumente bekommen. Wenn Du also tkFenster in `Ja` brauchst, dann über gib dies als Argument, z.B. mit Hilfe von `functools.partial`.

Zum Code: Funktionen und Variablennamen werden klein_mit_unterstrich geschrieben, *-Importe vermeiden, weil damit unkontrolliert Namen in den eigenen Namensraum geschaufelt werden, üblicherweise benutzt man `import tkinter as tk` und referenziert alle Namen daraus über tk.xyz
`bind` ist nicht dazu gedacht, die Aktion an einen Knopf zu binden. Dafür gibt es das command-Argument. `bind` verhält sich nicht so, wie der Nutzer es von einem Knopf gewohnt ist.
Statt place, pack oder grid verwenden, weil place absolut plaziert und damit GUIs bei anderer Auflösung oder einem anderen System unbenutzbar werden könnten.
Bambam04
User
Beiträge: 3
Registriert: Sonntag 12. Mai 2019, 13:46

Erstmal Danke für deine Antwort und die vielen Verbesserungsvorschläge.
Das ist mein erstes Programm mit tkinter und ich habe generell erst ein halbes Jahr Informatikunterricht.
Deshalb versteh ich nicht was ich jetzt mit "functools.partial" anfangen soll. :?
Könntest Du mir das bitte etwas genauer erklären oder den teil ihm Code ändern wenn dies nicht zu viel Aufwand wäre. :)
Sirius3
User
Beiträge: 18270
Registriert: Sonntag 21. Oktober 2012, 17:20

Hast Du `partial` in der Dokumentation schon nachgeschlagen?
Da die Funktionen nur einen Aufruf haben, kannst Du aber statt dessen auch fensterFrage.destroy direkt als Wert für command= angeben.
Bambam04
User
Beiträge: 3
Registriert: Sonntag 12. Mai 2019, 13:46

Hab jetzt einfach das ".bind" weggemacht und wie du geschrieben hast .destroy als command eingefügt und es funktioniert.
Vielen Dank für deine Hilfe.(:
Antworten