Tkinter: cleaning up when a toplevel is destroyed

David R. Smith drs at labs.agilent.com
Thu Nov 15 23:59:41 CET 2001


I want to create multiple gizmos and views of them, letting the views
overlap on the screen.  In my searching, I came across references to an
MS-Win-style multiple document interface widget set, but the links were
all stale.  P.32 of Grayson shows the creation of multiple toplevel
windows, and I figured that would be the ticket.  So I coded that up,
but I have a problem with how to delete a data structure when the user
deletes the associated toplevel window by clicking on its X-button in
the upper right corner.
What I have right now is:

class BlockView:
    def __init__(self, block,    # Display is of a block
                 title,             # for title bar
                 root,             # ur-toplevel interface
                 destroyCB):         # callback for when the window is
destroyed
        self.tl = Pmw.MegaToplevel(root)
        self.tl.bind('<Destroy>',
                     lambda event, self=self, destroyCB=destroyCB:
destroyCB(event,self))
        ...


The idea is that when the MegaToplevel is destroyed, BlockView sends a
'delete me' message to its creator via destroyCB.  The creator then
deletes the BlockView from its lists.

However, Destroy events get sent for all the children of the new
MegaToplevel.  I need to strain out all but one callback.  I thought I
could do it by rewriting the lambda expression as

        lambda event, self=self, destroyCB=destroyCB: event.widget is
self.tl and destroyCB(event,self))

but this never calls destroyCB.  I tried rewriting the new test as

                event.widget is self.tl.interior()

but that didn't activate, either.  Obviously, I don't understand what
event.widget is, and Grayson's explanation of events isn't very
thorough.  Can someone give me some hints here?

     TIA
     David Smith






More information about the Python-list mailing list