Posted to tcl by dgp at Mon Jun 01 18:31:45 GMT 2009view pretty
proc SimpleDialog {} { global goo set win .sd toplevel $win button $win.b -text "OK" -command {set goo 1} pack $win.b update idletasks tkwait visibility $win grab $win tkwait variable goo grab release $win # after 0 "destroy $win" ;# This one OK destroy $win ;# This one crashes } proc goo { win } { SimpleDialog destroy $win } proc foo { win } { toplevel $win button $win.b -text "Do dialog" -command "goo $win" pack $win.b } button .b -text "Start" -command {foo .t} pack .b
Comments
Posted by patthoyts at Mon Jun 01 23:41:56 GMT 2009 [text] [code]
Because a grab is in place when one window is activated the activation is posted as an event. When this event is handled the target window has been destroyed and the window member of the TkWindow is 0. This is passed to Tk_GetHWND which does not expect to receive NULL values as Window pointers and throws an exception. Probably we should check in tkWinWm.c:ActivateWindow that the grab state is not TK_GRAB_NONE or just check the winPtr->window is non-nil