Hi all, I'm working on a (Python) program which, in short, is a threaded TCP socket server which creates a new "tab" in a wx.Notebook widget for every incoming connection it sees. I've run into a strange problem where when I call notebook.AddPage(...), one of three things happens:
- A "tab" correctly appears for the new page
- No new "tab" appears, even though if I call GetPageCount() on the notebook, it returns the correct value
- I receive the following error: "*** glibc detected *** python: double free or corruption (fasttop): 0x000000000164dbe0 ****" followed by a very long backtrace with a cryptic memory map.
Since it would be inconsiderate to post all of my code here, I wrote a little script (based on something I found online) which also exhibits this behavior (although it works correctly most of the time).
import wx
from wx.lib.pubsub import Publisher
import thread
import time
# Some classes to use for the notebook pages. Obviously you would
# want to use something more meaningful for your application, these
# are just for illustration.
class PageOne(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
t = wx.StaticText(self, -1, "This is a PageOne object", (20,20))
class PageTwo(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
t = wx.StaticText(self, -1, "This is a PageTwo object", (40,40))
class PageThree(wx.Panel):
def __init__(self, parent):
wx.Panel.__init__(self, parent)
t = wx.StaticText(self, -1, "This is a PageThree object", (60,60))
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="Simple Notebook Example", size=(600, 500))
Publisher.subscribe(self.NewPage, "add.page")
# Here we create a panel and a notebook on the panel
panel = wx.Panel(self)
self.notebook = wx.Notebook(panel)
# create the page windows as children of the notebook
page1 = PageOne(self.notebook)
page2 = PageTwo(self.notebook)
page3 = PageThree(self.notebook)
# add the pages to the notebook with the label to show on the tab
self.notebook.AddPage(page1, "Main")
# finally, put the notebook in a sizer for the panel to manage
# the layout
sizer = wx.BoxSizer()
sizer.Add(self.notebook, 1, wx.EXPAND)
panel.SetSizer(sizer)
def NewPage(self, msg):
name = msg.data
page = PageOne(self.notebook)
self.notebook.AddPage(page, name)
print "Added page with name: '" + name + "'."
def delayedPageAdd():
n = 1
while n < 10:
time.sleep(1)
Publisher.sendMessage("add.page", ("Page%d" % n))
n += 1
if __name__ == "__main__":
app = wx.App()
MainFrame().Show()
thread.start_new_thread(delayedPageAdd, ())
app.MainLoop()
In summary, this code creates a wx.Notebook widget and then spawns off a thread that creates a new tab/page every second and adds it to the notebook.
Thank you so much in advance if anybody has any idea what is going on.