Seite 1 von 1

beim beenden nachfragen

Verfasst: Donnerstag 3. Mai 2007, 17:34
von Cthulhu
ich möchte gerne dass wenn ich auf meinen beenden button klicke ein neues infofenster aufgemacht wird in der gefragt wird wirklich schließen ja nein
aber wie mach ich das, dass mein tkinter fenster nicht direkt shcon zugeht sondert erst wartet bis der befehl von dem kleinen fenster gekommen ist!
also ich hab zum schließen root.destroi() benutzt!

Verfasst: Donnerstag 3. Mai 2007, 18:26
von joost
Der Callback für Deinen Beenden-Button muss das Ja/Nein-Fenster ja aufbauen (und sehr wahrscheinlich neu konstruieren). Dieses Fenster kann man modal machen

Das ist dann alles, was dieser Callback tut. Man muss das Fenster noch modal machen mit widget.grab_set().
http://infohost.nmt.edu/tcc/help/pubs/t ... ersal.html

Die Selbstzerstörung dieses Dialoges und ggf. der Anwendung machen dann beide Callbacks für die Buttons auf Deinem Dialogfenster.

Verfasst: Donnerstag 3. Mai 2007, 19:52
von pyStyler
Hallo,
ok, die Lösung ist sehr einfach schau.

Code: Alles auswählen

import Tkinter
from tkMessageBox import askokcancel

root = Tkinter.Tk()

def beenden_ja_nein(hauptwidget):
    frage = askokcancel('Beenden?', 'Programm beenden?')
    if frage:
        hauptwidget.quit()
       
def beenden():
    beenden_ja_nein(root)
   
Tkinter.Button(root, text='Beenden', command=beenden).pack()
root.mainloop()
Gruss
pyStyler

Verfasst: Donnerstag 3. Mai 2007, 20:41
von Cthulhu
Tkinter.Button(root, text='Beenden', command=beenden).pack()
also in der reihe ist mir die klammersetzung uneinsichtig!
ist doch falsch gesetzt oder??
müsste doch so heißen?
Tkinter.Button(root, text='Beenden', command=beenden.pack())

Verfasst: Donnerstag 3. Mai 2007, 20:57
von pyStyler
nein, ist richtig. :evil:
hast du vergessen wie deine frage war?

Verfasst: Freitag 4. Mai 2007, 14:34
von schlangenbeschwörer
Hi Cthulhu!
Du packst doch den Button, dessen command-Argument die Funktion 'beenden' ist. Anders wäre es sinnlos, es sei den, beenden.pack wäre eine von dir neu definierte Funktion, die du direkt aufrufst, um eine andere Funktion zu erhalten.

Zum Beenden sollte man auch eigentlich root.quit() und root.destroy() nehmen, denn mit der einen Methode verlässt man den mainloop und mit der anderen löscht man das Fenster vom Bildschirm. Macht man nur das eine, hat man entweder nach ein paar Testdurchläufen den Bildschirm voll mit toten Fenstern, oder das Fenster ist weg und die Idle reagiert nicht mehr, da sie noch im mainloop hängt, auf den man ja aber nicht mehr zugreifen kann.

Gruß, jj

Verfasst: Freitag 4. Mai 2007, 14:46
von Cthulhu
achso jetzt hab ichs verstanden!
wir schreiben in der schule das .pack immer neu untendrunter!
danke

Verfasst: Freitag 4. Mai 2007, 14:56
von schlangenbeschwörer
Cthulhu hat geschrieben:wir schreiben in der schule das .pack immer neu untendrunter!danke
...ist auch besser so. (-> Lesbarkeit)
Nur in so kurzen Bsp. kann man das auch mit angehängtem .pack lesen.

Verfasst: Freitag 4. Mai 2007, 15:05
von Cthulhu
das funktioniert jetzt aber da steht ja jetzt "ok" und "abbrechen"
kann man das nich noch zu "ja" und "nein" verändern?

Verfasst: Freitag 4. Mai 2007, 15:13
von schlangenbeschwörer

Code: Alles auswählen

from tkMessageBox import askyesno
askyesno('Beenden?', 'Programm beenden?')

Verfasst: Freitag 4. Mai 2007, 15:40
von Cthulhu
dankeschön

Verfasst: Montag 7. Mai 2007, 21:24
von jAN
wenn du noch das x oben in der Ecke abfangen willst geht das mit

root.wm_protocol("WM_DELETE_WINDOW",callback)

der callback ist dabei deine Funktion...
diese muss allerdings dann root.quit() und root.destroy() aufrufen um das fenster zu schließen...