Kann man destroy() auch in Funktionen verwenden?

Fragen zu Tkinter.
Antworten
Spacekiss
User
Beiträge: 13
Registriert: Donnerstag 2. Juni 2005, 10:54

Donnerstag 2. Juni 2005, 11:04

Hallo,

hab folgendes Problem ich erzeuge ein Toplevel Fenster in dem ich zum Beispiel einen Button programmiere, der über das command Attribut eine weiteres Toplevel aufruft.
In dem zweiten Toplevel Fenster sind zum Beispiel ein "OK" Button und ein "Cancel" Button. Nun kann man ja für den Cancel Button übder das command Attribut "name_des_zweiten_toplevels.destroy() aufrufen um das Fenster zu schliesen.

UND NUN ZU DEM EIGENTLICHEN PROBLEM

Den "OK" Button aus dem zweiten Toplevel soll über command eine Funktion zugewiesen werden. Die Funktion soll so lauten, dass zum Beipsiel ein Eingaefeld ausgelesen wird und anschliessend das Fenster ebenfalls geschlossen wird, und genau ist mein Problem, mit welchem Befehl kann ich ein Fenster schliessen lassen, wenn ich in einer Funktion zu diesem Fenster arbeite, mit destory hab ich alles mögliche schon probiert, er erzeugt auch keinen compile Fehler aber funktionieren tut es auch nicht..

MIT WELCHEM BEFEHL KANN ICH DAS ZWEITE TOPLEVEL FENSTER IN DER FUNKTION WIEDER SCHLIESSEN????

Vielen Dank im voraus
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Donnerstag 2. Juni 2005, 13:08

Hi!
Spacekiss hat geschrieben: mit welchem Befehl kann ich ein Fenster schliessen lassen, wenn ich in einer Funktion zu diesem Fenster arbeite,
Versteh ich nicht. Naja, vielleicht hilft Dir das folgende Snippet:

Code: Alles auswählen

from Tkinter import *

def create_top1():
    top1 = Toplevel()
    Button(top1,text="New",command=create_top2).pack()
    Button(top1,text="Cancel",command=top1.destroy).pack()

def quit_top2(top, entry):
    print entry.get()
    top.destroy()

def create_top2():
    top2 = Toplevel()
    e = Entry(top2)
    e.pack()
    Button(top2,text="Ok",command=lambda: quit_top2(top2,e)).pack()

root = Tk()
Button(text="Go",command=create_top1).pack()
root.mainloop()
Gruß, mawe
Spacekiss
User
Beiträge: 13
Registriert: Donnerstag 2. Juni 2005, 10:54

Donnerstag 2. Juni 2005, 23:52

Hey, erstmal vielen Dank für die schnelle Antwort. ich erklärs nochmal anhand dem Quellcode. Es ist wahrscheinlich nur eine Minikleinigkeit die fehlt :

Code: Alles auswählen

 def varInput(self):
        rootVar = Tk()
        rootVar.title("BLI - Variablen Eingabe")
        width = 250
        height = 120
        
        label=Label(rootVar, text= "Bitte Variable eingeben")
        label.pack(side=TOP)

        self.vareingabe = Entry(rootVar, width=40, bg="white")
        self.vareingabe.pack(side=TOP, padx = 20, pady = 20, fill=X)

        ok = Button(rootVar, text= "OK", command = self.varOK )
        ok.pack(side=LEFT, padx = 20, pady = 1)   
 
        abbrechen = Button(rootVar, text="Exit", command = rootVar.destroy )
        abbrechen.pack(side=RIGHT, padx = 20, pady = 1)

        mainloop()

# OK Button 

    def varOK(self):
        self.eingabe.insert(INSERT, self.vareingabe.get())
	### hier benötige ich einen Befehl, der das Fenster schliesst ###
Man muss dazu sagen, dass dieses Fenster in meinem Programm ein Zweitfenster ist, das heisst es exitsiert noch ein Main Widget in der ein Button die Fuktion "varOK" (von der der Code dargestellt ist) aufruft.
Mein Problem ist nun, ich brauch einen Befehl an der Stelle vom Code mit den ganzen ###############, der das varOK Fenster nach drücken wieder schliesst

Edit (Leonidas): Code in Python-Tags gesetzt.
BlackJack

Freitag 3. Juni 2005, 21:08

Soweit ich mich erinnere darf man nur ein Widget mit `Tkinter.Tk()` erstellen. Andere Toplevel-Widgets, ausser dem Hauptfenster mit `Tkinter.Toplevel()`.
Spacekiss
User
Beiträge: 13
Registriert: Donnerstag 2. Juni 2005, 10:54

Freitag 3. Juni 2005, 21:23

Ja stimmt :-) aber selbst mit rootVar = Toplevel() kann ich mit keiner normalen destroy Funtkion das Fenster nach dem Auslesen schliesen lassen :?
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Freitag 3. Juni 2005, 21:28

Hi!

@Blackjack:
Dürfen und sollen sind 2 verschiedene Dinge ;) Du darfst mehrmals Tk() verwenden, Du sollst es aber nicht. Führt zu komischem Verhalten, siehe Tk-Scripte die man aus idle heraus aufruft.

@Spacekiss:
Hör auf Blackjack und verwende Toplevel(). Oder vielleicht noch besser: Verwende einen tkDialog

Code: Alles auswählen

from Tkinter import *
import tkSimpleDialog

def ask():
    text = tkSimpleDialog.askstring("Question", "Enter whatever")
    print text

root = Tk()
Button(text="Ask it", command=ask).pack()
root.mainloop()
Gruß, mawe
Antworten