On Sun, Jun 29, 2008 at 9:22 AM, Jusa <[EMAIL PROTECTED]> wrote: > > > > Mick O'Donnell wrote: >> >> Hi Jusa, >> >> Can you post some sample code which causes the problem? >> >> Mick >> _______________________________________________ >> Tkinter-discuss mailing list >> Tkinter-discuss@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() >
Here, supposing you closed the "Hello" window, self (representing the "parent" dialog) would have been destroyed by now. Then next: > #ERROR: > dlg = MyMessageDialog(self, 'Error', 'This dialog causes the > error.') > dlg.display() > #/ERROR You try to use "self" as the parent, which is not valid anymore. You could change this to self.master, which still exists. > > 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. > > _______________________________________________ > Tkinter-discuss mailing list > Tkinter-discuss@python.org > http://mail.python.org/mailman/listinfo/tkinter-discuss > -- -- Guilherme H. Polo Goncalves _______________________________________________ Tkinter-discuss mailing list Tkinter-discuss@python.org http://mail.python.org/mailman/listinfo/tkinter-discuss