Zoff mit tkMessageBoxen

Fragen zu Tkinter.
Antworten
Gast

Mittwoch 10. September 2003, 17:49

hallo zusammen!

jetzt habe ich echt keine ahnung mehr wo der fehler liegen könnte und die fantasie geht mir auch aus, also wende ich mich mal ans forum. folgender code ist nur ein beispiel um das problem darzustellen:

Code: Alles auswählen

#/usr/bin/python

from Tkinter import *
import tkMessageBox


def ende():
    antwort=tkMessageBox.askyesno("Warnung","Wollen Sie sicher beenden?")
    if antwort==1:
        sys.exit(0)


def mainexit():
    root.destroy()
    

def neu():
    
    root=Tk()
    root.title("FensterB")

    label=Label(root,text="///GARO_GUI")
    label.grid(row=0,column=0,columnspan=2)

    #Button nur zur Zierde einstweilen
    button=Button(root, text="Irgendwas")
    button.grid(row=1,column=0,columnspan=2)

    button2=Button(root, text="Ende",command=ende)
    button2.grid(row=2,column=0,columnspan=2)

    


root=Tk()
root.title("FensterA")
root.protocol("WM_DELETE_WINDOW", mainexit)

label=Label(root,text="///GARO_GUI")
label.grid(row=0,column=0,columnspan=2)

button=Button(root, text="Neues Fenster",command=neu)
button.grid(row=1,column=0,columnspan=2)

button2=Button(root,text="Ende",command=ende)
button2.grid(row=2,column=0,columnspan=2)

root.mainloop()
 
erstellt werden soll also eine anwendung die mehrere fenster hat und es kann ja durchaussein, dass der anwender fenster, die er eh nicht mehr braucht, z.b. ein menüfenster weil er keine auswahl mehr treffen will, über "x" schliesst. ich habe wie man sieht auch probiert root expliziert zu zerstören.

nun zum eigentlichen problem: schliesst der anwender das FensterA mit "x" und ruft dann über den Button "Ende" vom FensterB die funtkion ende auf, wird eine tkMessageBox augerufen um den Anwender zu fragen ob er sicher beenden will, aber leider wird auch gleichzeitig ein neues root erschaffen!!!

also FensterA über "x" schliessen" anwendung mit Button "Ende" von FensterB beenden = tkMessagebox und neues Fenster!!!

umgekehrt tritt das problem übrigens nicht auf.

wer kann mir da weiterhelfen???

vielen dank im voraus

mfg

roland
xturbo77
User
Beiträge: 39
Registriert: Montag 9. September 2002, 20:05
Kontaktdaten:

Donnerstag 11. September 2003, 08:25

Ich kann dir leider keine Lösung bieten da ich mich mit Tkinter leider kaum auskenne.
Ich kann dir aber sagen woran es liegt dass ein neues root Fenster erstellt wird. tkMessageBox braucht zwingend ein master root Window, selbst wenn du es nicht verwenden möchtest. Versuche folgendes, und du wirst feststellen dass automatisch ein root Window erzeugt wird:

Code: Alles auswählen

from Tkinter import *
import tkMessageBox

result = tkMessageBox.askyesno()
Ich hatte selber mal dieses Problem um nach Ablauf eines Kommandozeilen Scripts eine simple MessageBox anzuzeigen. In der pythonmailinglist bin ich auf folgendes gestossen:

Code: Alles auswählen

from Tkinter import *
import tkMessageBox

root = Tk()
root.withdraw()
result = tkMessageBox.askyesno()

root.mainloop()
root wird einfach unsichtbar gemacht. Nicht gerade elegant, aber es geht!

In deinem Fall ist dein root Window zerstört (mainexit). Du hast nun 2 Möglichkeiten. 1. du zerstörst dein master root niemals sondern machst es unsichtbar. 2. du übergibst deiner ende Methode das master widget

Nachtrag:
Du siehst übrigens auch dass wenn du im FensterB den Ende Button klickst das fensterA den Focus bekommt, d.h. FensterA ist master der MessageBox.
Ich habe es gerade mal mit withdraw ausprobiert, es scheint prima zu klappen. :wink:

Code: Alles auswählen

def mainexit(): 
    root.withdraw() 
Gast

Donnerstag 11. September 2003, 14:16

hi

super, du hast recht, in mainexit muss root.withdraw() kommen.

schade, dass es wohl keine saubere lösung gibt, aber schlussendlich muss es ja nur funktionieren.

bis bald

roland
Antworten