Subfenster elegant schließen

Fragen zu Tkinter.
Antworten
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Hallo,

ich habe ein Hauptfenster und zwei Buttons. Drücke ich im Hauptfenster auf XXX, dann soll ich ein Subfenster öffnen, dass auch zwei Buttons hat.

Drücke ich nun wieder im Hauptfenster auf Button XXX, dann soll die Beenden-Methode (do_exit) der Klasse Buttons ausgeführt und das Subfenster geschlossen werden. Ebenso, wenn ich im Button-Fenster der Klasse Button auf Beenden klicke, soll die Funktion do_exit ausgeführt werden.

Leider beendet sich nicht nur das Subfenster, sondern auch mit das Hauptfenster. Das Subfenster habe ich mit tk.Toplevel erzeugt, weil ich las, dass man damit ein neues zweites Fenster parallel zum Hauptfenster der GUI erstellen kann.

Könntet ihr mir einen Tipp geben, was ich falsch mache oder welche Funktionen ich alternativ in der Klasse Buttons anstatt von .quit und .destroy benutzen soll, die zum Abschalten der gesamten Anwendung führen? Ich würde mich sehr über Eure Hilfe freuen.

Code: Alles auswählen

try:
    import tkinter as tk
except:
    import Tkinter as tk

from functools import partial




class Buttons():
    def __init__(self, master):
        self.master=master
        self.button1 = tk.Button(self.master, text="Button 1", command=self.do_button1)
        self.exitbutton = tk.Button(self.master, text="Beenden", command=self.do_exit)

        self.button1.pack()
        self.exitbutton.pack()

    def do_button1(self):
        print("Button 1 gedrueckt")

    def do_exit(self):
        self.master.quit()
        self.master.destroy()
        print ("Buttons beendet!")


class MainFrame():

    def __init__(self):
        self.root = tk.Tk()
        self.state=False

        start_class_button = tk.Button(self.root, text="XXX", command=self.do_start_class, width=20)
        exit_button = tk.Button(self.root, text="beenden", command=self.do_exit, width=20)

        start_class_button.pack()
        exit_button.pack()

        self.root.mainloop()

    def do_exit(self):
        self.root.quit()
        self.root.destroy()


    def do_start_class(self):
        if self.state==False:
            print ("starte Subfenster...")
            self.buttons = Buttons(tk.Toplevel())

            self.state=True
        else:
            print ("schließe Subfenster...")
            self.state=False



myframe = MainFrame()

print ("Programm beendet")
BlackJack

@Papp Nase: Du darfst `quit()` halt nur verwenden wenn Du die laufende Tk-Hauptschleife beenden willst. Also *nicht* im Subfenster. Wobei die `Buttons`-Klasse so etwas komisch in der Verwendung ist weil etwas unerwartet das ein Fenster Bestandteil eines `Buttons`-Objekts ist und nicht umgekehrt.
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Vielen Dank für Deine Antwort.

Das ich .quit() nicht verwenden kann, ist ja dann schon klar. Ich möchte aber doch nur das Subfenster schließen. Drücke ich einmal auf den XXX-Button in dem Hauptfenster, dann soll das Subfenster mit den beiden Buttons geöffnet und beim zweiten mal geschlossen werden (nicht das Hauptfenster).

Ich könnte in dem Subfenster auch noch andere Sachen machen - z.B. einen Graphen anzeigen lassen oder was auch immer, aber ich möchte ein Subfenster eben schließen können, ohne das das Hauptfenster geschlossen wird und das ist mein Problem.
Schorlem
User
Beiträge: 40
Registriert: Dienstag 3. Juni 2014, 16:37

Für mich läuft es, wenn ich in der "do_exit"-Methode von "Buttons" die Zeile mit "quit()" auskommentiere und im else-Zweig von "start_new_class" noch "self.buttons.do_exit()" einfüge.

Du solltest allerdings beachten, dass das Ganze so ziemlich empfindlich auf andere Weise, das Fenster zu schließen, reagiert. Im Moment ändert sich dein "state"-Attribut nur beim Klicken des entsprechenden Buttons, du kannst allerdings beim Schließen eines Fensters mit

Code: Alles auswählen

self.master.protocol("WM_DELETE_WINDOW", method)
entsprechend darauf reagieren.
Diese Nachricht wurde maschinell erstellt und ist daher ohne Unterschrift gültig.
Papp Nase
User
Beiträge: 139
Registriert: Dienstag 11. März 2014, 15:12

Vielen Dank fuer Deine Antwort. Also schließe ich ein Subfenster einfach mit einem .destroy? So funktioniert es zumindest jetzt.

Das mit dem X-Knopf muss ich noch abfangen, das stimmt. Das hab ich schon mal gelesen, wie das geht - ich kann es auch an eine Funktion knüpfen, die dann ausgeführt wird und da kann man dann darauf reagieren, je nachdem, was man mit der Anwendung macht.
Antworten