[pygtk] How to destroy Window hierarchy and corner cases
Alessandro Dentella
sandro at e-den.it
Sat Dec 5 07:07:57 WST 2009
On Fri, Dec 04, 2009 at 11:52:55PM +0100, Pietro Battiston wrote:
> Il giorno ven, 04/12/2009 alle 19.20 +0100, Alessandro Dentella ha
> scritto:
> > Hi,
> >
> > I have an application that writes to StatusBar and uses timeout_add to
> > delete the message after a fixed number of seconds.
> >
> > If in the meanwhile I destroy() the toplevel window I notice that under
> > Linux I get the following message:
> >
> > /home/misc/src/hg/py/sqlkit/sqlkit/layout/layout.py:661: GtkWarning: gtk_label_set_text: assertion `GTK_IS_LABEL (label)' failed
> > msg_id = sb.push(idx, txt)
> > /home/misc/src/hg/py/sqlkit/sqlkit/layout/layout.py:669: GtkWarning: gtk_label_set_text: assertion `GTK_IS_LABEL (label)' failed
> > sb.remove(idx, msg_id)
> >
> > Under Windows sometimes it just crashed the application.
> >
> >
> > The problem is that when I receive a delete-event from a window, I
> > destroy() it but the children are not really destroyed, e.g., with
> > ipython you can still browse all its methods. The difference is that
> > get_toplevel() will return the widget itself rather than the toplevel.
> >
> >
> > Which is the correct/suggested way to destroy all elements of a hierarcy
> > of widgets upon delete-event?
> >
>
>
> (I might be wrong, but) I think that "destroy()" is not exactly what you
> think. I mean: for instance,
>
> w=gtk.Window()
> w.destroy()
> w.get_position()
>
> works perfectly and returns (0,0).
mmh that's something I wouldn't have expected in fact.
I think I'm really confused about destroy/delete freeing memory in this cases.
> Destroying a widget simply means deleting it from any widget gerarchy:
> for instance, if your widget is in a container, the container will
> "forget" about it; if your widget is a toplevel, it will disappear from
> the toplevels list.
>
> Then, if(f) the reference count for the object goes to 0, the object
> will be presumably really destroyed (its memory freed), but if you
> (through pure python, not pygtk) keep some reference to it, it will stay
> there: that's why the above "w.destroy" has no effect at all.
>
> When you destroy a toplevel, its children are destroyed only in the
> sense that they may become unreferenced, and then disappear.
>
> That said, I don't understand the error you get, neither why you'll
> experience crashes in Windows, and there _may_ be some (py)gtk bug
> showing; however, if I understood correctly what you're assuming, I hope
> I explained correctly why it's not a correct assumption.
yes, that make sense at least!
sandro
*:-)
--
Sandro Dentella *:-)
http://sqlkit.argolinux.org SQLkit home page - PyGTK/python/sqlalchemy
More information about the pygtk
mailing list