[Tkinter-discuss] TclError when destroying parent windows
Jusa
sj.m at iloinen.net
Sun Jun 29 14:22:45 CEST 2008
Mick O'Donnell wrote:
>
> Hi Jusa,
>
> Can you post some sample code which causes the problem?
>
> Mick
> _______________________________________________
> Tkinter-discuss mailing list
> Tkinter-discuss at python.org
> http://mail.python.org/mailman/listinfo/tkinter-discuss
>
>
Hi Mick,
It's rather lengthy but here goes (the error-causing lines are at the
bottom):
from Tkinter import *
class MyDialog(Toplevel):
'''
Base class for custom dialogs.
'''
def __init__(self, master, title, size):
Toplevel.__init__(self, master)
self.title(title)
self.accepted = False
x = self.master.winfo_rootx() + self.master.winfo_width() / 2
y = self.master.winfo_rooty() + self.master.winfo_height() / 2
self.columnconfigure(0, weight=1)
self.rowconfigure(0, weight=1)
self.wndSize = size
self.geometry('+%d+%d' % (size[0], size[1]))
def display(self):
'''
Displays the dialog and returns the parameters polled from the user.
'''
self.build()
self.transient(self.master)
self.grab_set()
self.protocol('WN_DELETE_WINDOW', self.onCancel)
x = self.master.winfo_rootx() + self.master.winfo_width() / 2
y = self.master.winfo_rooty() + self.master.winfo_height() / 2
self.geometry('+%d+%d' % (x, y))
self.wait_window(self)
return self.output()
def build(self):
'''
Override: use this to construct the widgets on the dialog.
'''
def output(self):
'''
Override: use this to return any dialog-specific parameters at the
end of display()
'''
return None
def validate(self):
'''
Override: use this to validate user input in the dialog.
'''
return True
def onOk(self, event=None):
'''
Callback for accepting the dialog.
'''
if self.validate() == False:
return
self.accepted = True
self.withdraw()
self.update_idletasks()
self.onCancel()
def onCancel(self, event=None):
'''
Callback for rejecting the dialog.
'''
self.master.focus_set()
self.master.grab_set()
self.destroy()
class MyMessageDialog(MyDialog):
'''
A simple custom message dialog.
'''
def __init__(self, master, title, message, btnText='Ok', size=(200,
80)):
MyDialog.__init__(self, master, title, size)
self.message = message
self.btnText = btnText
def build(self):
self.frame = Frame(self, padx=7, pady=7)
self.frame.pack(fill=BOTH, expand=YES)
self.messageLbl = Label(self.frame, text=self.message,
wraplength=self.wndSize[0]-7*2, justify=CENTER)
self.messageLbl.pack(fill=BOTH, expand=YES)
self.yesBtn = Button(self.frame, text=self.btnText,
command=self.onOpenError)
self.yesBtn.pack(pady=5)
self.bind('<Return>', self.onOk)
self.bind('<Escape>', self.onOk)
def onOpenError(self):
dlg = MyMessageDialog(self, 'Watch out', 'En error occurs when you
close the window \'Hello\'.', 'Don\'t press this')
dlg.display()
#ERROR:
dlg = MyMessageDialog(self, 'Error', 'This dialog causes the
error.')
dlg.display()
#/ERROR
root = Tk()
hello = MyMessageDialog(root, 'Hello', 'Good day!', 'Open error')
params = hello.display()
root.mainloop()
--
View this message in context: http://www.nabble.com/TclError-when-destroying-parent-windows-tp18178579p18180082.html
Sent from the Python - tkinter-discuss mailing list archive at Nabble.com.
More information about the Tkinter-discuss
mailing list