beim beenden nachfragen

Fragen zu Tkinter.
Antworten
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

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!
joost
gelöscht
Beiträge: 134
Registriert: Sonntag 29. April 2007, 13:28

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.
[color=green][size=75]Never use idle.pyw, if you need sys.stdin[/size][/color]
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

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())
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

nein, ist richtig. :evil:
hast du vergessen wie deine frage war?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

achso jetzt hab ichs verstanden!
wir schreiben in der schule das .pack immer neu untendrunter!
danke
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

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.
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

das funktioniert jetzt aber da steht ja jetzt "ok" und "abbrechen"
kann man das nich noch zu "ja" und "nein" verändern?
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Code: Alles auswählen

from tkMessageBox import askyesno
askyesno('Beenden?', 'Programm beenden?')
Cthulhu
User
Beiträge: 38
Registriert: Freitag 17. November 2006, 16:00

dankeschön
jAN
User
Beiträge: 170
Registriert: Samstag 4. Juni 2005, 18:51
Wohnort: Großmehlra (in Thüringen)
Kontaktdaten:

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...
#adios.py
import os,sys
while 1: os.startfile(sys.argv[0])
Antworten