2016-05-25 3 views
0

Ich möchte eine Schaltfläche in meinem Fenster, um ein neues Fenster zu öffnen und die vorherige zu schließen. Ist es möglich, eine Taste beide zu haben? Ich habe in dem folgenden Code versucht, aber es hat nicht funktioniert, hat mir nur gesagt, dass Fenster nicht definiert ist:Wie schließt man ein tkinter-Fenster in einer anderen Funktion?

import tkinter 
def window1(): 
    window = tkinter.Tk() 
    tkinter.Button(window, text = "Next", command = window2).pack() 
    window.mainloop() 
def window2(): 
    window.destroy() #This is where the error is 
    menu = tkinter.Tk() 
    etc, etc, etc 
window1() 
+0

Ist das eine Hausaufgabe? Dies ist die zweite Frage zu fast genau diesem Thema, das ich in der letzten Stunde gesehen habe. –

Antwort

1

Zuerst müssen Sie das Fenster-Objekt aus der ersten Funktion zurückzukehren:

def window1(): 
    window = tkinter.Tk() 
    tkinter.Button(window, text = "Next", command = lambda: window2(window)).pack() 
    window.mainloop() 
    return window 

dann müssen Sie das Fenster als Argument an die Funktion zu übergeben:

def window2(window): 
    window.destroy() 
    menu = tkinter.Tk() 

Und dann rufen window1 mit:

window = window1() 

und klicken Sie auf die Taste, um es zu zerstören und den Rest erledigen

+0

haben Sie das ziemlich wichtige Detail weggelassen, wie man einen Parameter mit einem Knopf übergibt. –

+0

Das jetzt hinzugefügt ... – Munir

+0

'return window' ist ein bisschen sinnlos, da das Fenster bis zum Zeitpunkt der Rückkehr der Funktion zerstört wurde. –

1

Dies ist ein Beispiel unter Verwendung von Toplevels, die in der Regel eine bessere Wahl ist als das Erstellen, zu zerstören, neu zu erstellen Tk() Instanzen. Die eindeutige Toplevel-ID wird mit partially() an die Funktion close_it übergeben. Sie würden sie natürlich kombinieren oder die close-Funktion die open-Funktion aufrufen lassen.

try: 
    import Tkinter as tk  ## Python 2.x 
except ImportError: 
    import tkinter as tk  ## Python 3.x 

from functools import partial 

class OpenToplevels(): 
    """ open and close additional Toplevels with a button 
    """ 
    def __init__(self): 
     self.root = tk.Tk() 
     self.button_ctr=0 
     but=tk.Button(self.root, text="Open a Toplevel", 
         command=self.open_another) 
     but.grid(row=0, column=0) 
     tk.Button(self.root, text="Exit Tkinter", bg="red", 
        command=self.root.quit).grid(row=1, column=0, sticky="we") 
     self.root.mainloop() 

    def close_it(self, id): 
     id.destroy() 

    def open_another(self): 
     self.button_ctr += 1 
     id = tk.Toplevel(self.root) 
     id.title("Toplevel #%d" % (self.button_ctr)) 
     tk.Button(id, text="Close Toplevel #%d" % (self.button_ctr), 
        command=partial(self.close_it, id), 
        bg="orange", width=20).grid(row=1, column=0) 

Ot=OpenToplevels() 
0

Ja. Ist möglich. Aber Sie werden zu brauchen def dass:

def window1: 
    blablabla 
    blablabla 
def window2: 
    window2.destroy() <-- Here where the error was 

Wie Sie bemerkt haben, setzen Sie Ihren Namen des Fensters, was Sie wollen zerstören und es wird funktionieren!