Seite 1 von 1

Toplevel schließen ohne global

Verfasst: Sonntag 12. Mai 2019, 14:17
von Bambam04
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]

Re: Toplevel schließen ohne global

Verfasst: Sonntag 12. Mai 2019, 14:41
von Sirius3
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.

Re: Toplevel schließen ohne global

Verfasst: Sonntag 12. Mai 2019, 20:16
von Bambam04
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. :)

Re: Toplevel schließen ohne global

Verfasst: Sonntag 12. Mai 2019, 20:27
von Sirius3
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.

Re: Toplevel schließen ohne global

Verfasst: Sonntag 12. Mai 2019, 21:27
von Bambam04
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.(: