Please Hlp with msg: "The C++ part of the StaticText object has been deleted"


S

StvB

Hi,
I have a wxPython app which dump errors when I close it ( in
the debug output at bottom of Komodo, when I close my app. )

Where I got the code for my GUI:
Straight from the wxProject.py file which comes with the samples:
----
C:\Python23\Lib\site-packages\wx\samples\wxProject\wxProject.py ----

It basically consists of a splitterwindow, and I have a wxPanel
on the left side, which is set to a vertical box sizer. I used
the Add function of the sizer to simply add a wxStaticText control
at the very top.
The bottom half of this same left panel is a tree.
( u can ignore the *right* side of the splitter.. nothing exciting is
happening.. it's the same as in the wxProject.py sample ,
just a multilined edit contrl)

Anyway, when I click on a node of this tree, I change the text of the
static text control at top, to the text of the node. It actually works,
but when I close the app I get this:
----------------------------------------------
The stack trace:
E:\MyProjects1\python\backup
Traceback (most recent call last):
File "E:\MyProjects1\python\backup\wxProject.py", line 294, in
OnNodeChanged
self.testLab.SetLabel('test')
File "C:\Python23\Lib\site-packages\wx\_core.py", line 10617, in
__getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the StaticText object has been
deleted, attribute access no longer allowed.
---------------------------------------------


Here's how I add the wxStaticBox: ------------------------
# ok, first, the code below is actually in this __init__ function
class main_window(wxFrame):
def __init__(self, parent, id, title):
wxFrame.__init__(self, parent, -1, title, size = (650, 500),
style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)

# first the left panel
# -------------------
self.MyLeftPanel = wxPanel(splitter,10004) #<--a random number I used
#
didn't want to use -1
self.MyLeftPanel.SetDimensions(0, 0, 100, 220)
self.leftSizer=wxBoxSizer(wxVERTICAL) # the sizer is born
self.MyLeftPanel.SetSizer(self.leftSizer)
self.MyLeftPanel.SetAutoLayout(true)

# then add the static text
# -------------------
self.aNewID=wxNewId()
self.testLabel = wxStaticText(self.MyLeftPanel,self.aNewID,'test label')
self.leftSizer.Add(self.testLabel)


Here's how I code the event handler: ------------------

def OnNodeChanged(self,event):
item = self.tree.GetSelection()
if (self.tree.ItemHasChildren(item) == 0):
#self.testLabel.SetLabel(self.tree.GetItemText(item))
self.testLabel.SetLabel('test')
# The commented-out line works too.. the static text does change
# to the static of the node --- very nice, if it weren't
# for the error when you close the app.

Any suggestions would be great.
-S

p.s.
Here's the kicker:
Try running C:\Python23\Lib\site-packages\wx\samples\wxProject\wxProject.py
yourself. (but first remove, say, the editor on the right side,
add a panel and a sizer,and then add a statictext control
and add a tree handler to set the label). And it will work
fine. No error dump when you close it!

I double and triple checked that I am doing the same thing as in the
original file. I don't want to dump my own py file, and start over
with the original sample file. i've written too much probably for that.
 
Ad

Advertisements

R

Robin Dunn

StvB said:
Hi,
I have a wxPython app which dump errors when I close it ( in
the debug output at bottom of Komodo, when I close my app. )

Where I got the code for my GUI:
Straight from the wxProject.py file which comes with the samples:
----
C:\Python23\Lib\site-packages\wx\samples\wxProject\wxProject.py ----

It basically consists of a splitterwindow, and I have a wxPanel
on the left side, which is set to a vertical box sizer. I used
the Add function of the sizer to simply add a wxStaticText control
at the very top.
The bottom half of this same left panel is a tree.
( u can ignore the *right* side of the splitter.. nothing exciting is
happening.. it's the same as in the wxProject.py sample ,
just a multilined edit contrl)

Anyway, when I click on a node of this tree, I change the text of the
static text control at top, to the text of the node. It actually works,
but when I close the app I get this:
----------------------------------------------
The stack trace:
E:\MyProjects1\python\backup
Traceback (most recent call last):
File "E:\MyProjects1\python\backup\wxProject.py", line 294, in
OnNodeChanged
self.testLab.SetLabel('test')
File "C:\Python23\Lib\site-packages\wx\_core.py", line 10617, in
__getattr__
raise PyDeadObjectError(self.attrStr % self._name)
wx._core.PyDeadObjectError: The C++ part of the StaticText object has been
deleted, attribute access no longer allowed.
---------------------------------------------


When the treectrl is destroyed it removes each of its items, but when
the item that is selected is removed the tree will select another item
which causes the selection event to be sent causing your handler to try
to call SetLabel. If the statictext has already been destroyed at that
time then the Python proxy will raise the exception you reported above.
To avoid it you can check if the tree is being destroyed by calling its
IsBeingDeleted method and if it returns True just return immediately
from your event handler without doing anything.
 
Ad

Advertisements


Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top