def OnPaint(self, evt):
-        width, height = size =self.GetSize()
-        bmp = wx.EmptyBitmap(width, height)
-
-        dc = wx.MemoryDC()
-        dc.SelectObject(bmp)
-
-        
-        self.Draw(dc, size)
-
-        wdc = wx.PaintDC(self)
-        wdc.BeginDrawing()
-        wdc.Blit(0,0, size[0], size[1], dc, 0,0)
-        wdc.EndDrawing()
-
-        dc.SelectObject(wx.NullBitmap)
+        dc = wx.BufferedPaintDC(self)
+        self.Draw(dc, self.GetSize())
 
 
     def OnEraseBackground(self, evt):
 
 
 
-#----------------------------------------------------------------------
+#---------------------------------------------------------------------------
+
+class TestPanel(wx.Panel):
+    def __init__(self, parent, log):
+        self.log = log
+        wx.Panel.__init__(self, parent, -1)
+
+        b = wx.Button(self, -1, "Show Threads sample", (50,50))
+        self.Bind(wx.EVT_BUTTON, self.OnButton, b)
+
+
+    def OnButton(self, evt):
+        win = TestFrame(self, self.log)
+        win.Show(True)
+
+
+#---------------------------------------------------------------------------
+
 
 def runTest(frame, nb, log):
-    win = TestFrame(frame, log)
-    frame.otherWin = win
-    win.Show(True)
-    return None
+    win = TestPanel(nb, log)
+    return win
 
 #----------------------------------------------------------------------
 
 
 
 
+
 overview = """\
 The main issue with multi-threaded GUI programming is the thread safty
 of the GUI itself.  On most platforms the GUI is not thread safe and