Hi everyone, I have tried two days to figure out how to draw the image in wx.BufferedDC on the page created by AddPage of wx.Notebook but still got no clue.
The attached example works fine. If I click the menu "Draw" --> "New Drawing". The image with wx.BufferedDC/wx.BufferedPaintDC can move around on the frame. But If I uncomment those three commented lines in "class TestFrame" to add a new page (from wx.Notebook) with a tag and modify the last line like self.Window = DrawWindow(form2) I can not see the image from wx.BufferedDC anywhere and don't know what is going on. I need your help. Thanks a lot. The attached example is based on the example on the site: http://wiki.wxpython.org/index.cgi/DoubleBufferedDrawing ouyang import wx import random import os,time USE_BUFFERED_DC = 1 def opj(path): """Convert paths to the platform-specific separator""" str = apply(os.path.join, tuple(path.split('/'))) # HACK: on Linux, a leading / gets lost... if path.startswith('/'): str = '/' + str return str class BufferedWindow(wx.Window): def __init__(self, parent, id, pos = wx.DefaultPosition, size = wx.DefaultSize, style=wx.NO_FULL_REPAINT_ON_RESIZE): wx.Window.__init__(self, parent, id, pos, size, style) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_SIZE, self.OnSize) self.bmp0 = wx.Image(opj('image.bmp'), wx.BITMAP_TYPE_BMP) self.bmp0.SetMask(True) self.bmp = self.bmp0.Rotate(1.1215, (50,10), True,None) self.bmp = self.bmp.ConvertToBitmap() self.x = 100 self.y = 100 self.angle = 0.0 self.OnSize(None) def Draw(self,dc): pass def OnPaint(self, event): if USE_BUFFERED_DC: dc = wx.BufferedPaintDC(self, self._Buffer) else: dc = wx.PaintDC(self) dc.DrawBitmap(self._Buffer,0,0) def OnSize(self,event): self.Width, self.Height = self.GetClientSizeTuple() self._Buffer = wx.EmptyBitmap(self.Width, self.Height) self.UpdateDrawing() def SaveToFile(self,FileName,FileType): self._Buffer.SaveFile(FileName,FileType) def UpdateDrawing(self): if USE_BUFFERED_DC: dc = wx.BufferedDC(wx.ClientDC(self), self._Buffer) self.Draw(dc) else: # update the buffer dc = wx.MemoryDC() dc.SelectObject(self._Buffer) self.Draw(dc) # update the screen wx.ClientDC(self).Blit(0, 0, self.Width, self.Height, dc, 0, 0) class DrawWindow(BufferedWindow): def __init__(self, parent, id = -1): BufferedWindow.__init__(self, parent, id) def Draw(self, dc): dc.BeginDrawing() dc.SetBackground( wx.Brush("White") ) dc.Clear() # make sure you clear the bitmap! bmp = self.bmp0.Rotate(self.angle, (self.x,self.y), True,None) bmp = bmp.ConvertToBitmap() dc.DrawBitmap(bmp, self.x,self.y, True) dc.EndDrawing() class TestFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "Double Buffered Test", wx.DefaultPosition, size=(500,500), style=wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE) MenuBar = wx.MenuBar() file_menu = wx.Menu() ID_EXIT_MENU = wx.NewId() file_menu.Append(ID_EXIT_MENU, "E&xit","Terminate the program") self.Bind(wx.EVT_MENU, self.OnQuit, id=ID_EXIT_MENU) MenuBar.Append(file_menu, "&File") draw_menu = wx.Menu() ID_DRAW_MENU = wx.NewId() draw_menu.Append(ID_DRAW_MENU, "&New Drawing","Update the Drawing Data") self.Bind(wx.EVT_MENU, self.NewDrawing, id=ID_DRAW_MENU) BMP_ID = wx.NewId() draw_menu.Append(BMP_ID,'&Save Drawing\tAlt-I','') self.Bind(wx.EVT_MENU, self.SaveToFile, id=BMP_ID) MenuBar.Append(draw_menu, "&Draw") self.SetMenuBar(MenuBar) #nb = wx.Notebook(self, -1) #form2 = Form2(nb, -1) #nb.AddPage(form2, "Sizers") self.Window = DrawWindow(self) def OnQuit(self,event): self.Close(True) def NewDrawing(self,event): if event==None: self.Window.UpdateDrawing() else: self.Window.y = 100 for i in range(10): time.sleep(1) self.Window.y = self.Window.y + 5 self.Window.angle = self.Window.angle+0.1*1 self.Window.UpdateDrawing() def SaveToFile(self,event): dlg = wx.FileDialog(self, "Choose a file name to save the image as a PNG to", defaultDir = "", defaultFile = "", wildcard = "*.png", style=wx.SAVE) if dlg.ShowModal() == wx.ID_OK: self.Window.SaveToFile(dlg.GetPath(),wx.BITMAP_TYPE_PNG) dlg.Destroy() class Form2(wx.Panel): def __init__(self, parent, id): wx.Panel.__init__(self, parent, -1) class DemoApp(wx.App): def OnInit(self): wx.InitAllImageHandlers() # called so a PNG can be saved frame = TestFrame() frame.Show(True) frame.NewDrawing(None) self.SetTopWindow(frame) return True if __name__ == "__main__": app = DemoApp(0) app.MainLoop() -- http://mail.python.org/mailman/listinfo/python-list