import wx

class ImagePanel(wx.Panel):
    def __init__(self, parent):
        super(ImagePanel, self).__init__(parent)

        self._grid = 3

        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_SIZE, self.OnSize)

    def OnSize(self, evt):
        # Redraw as we are resized
        self.Refresh()
        evt.Skip()

    def SetGrid(self, grid):
        self._grid = grid
        self.Refresh() # Repaint

    def OnPaint(self, evt):
        dc = wx.PaintDC(self)
        rect = self.GetClientRect()
        # Draw a circle as our bitmap
        # For your app you would replace this with DrawBitmap
        dc.SetBrush(wx.RED_BRUSH)
        dc.SetPen(wx.BLACK_PEN)
        dc.DrawCircle(rect.x + (rect.Width / 2), 
                      rect.y + (rect.Height / 2), 
                      min(rect.Width, rect.Height) / 2)
        # Draw the Grid over the 'bitmap'
        dc.SetBrush(wx.TRANSPARENT_BRUSH)
        dc.SetPen(wx.Pen(wx.BLACK, 1, wx.DOT_DASH))
        ## Draw the lines for the Grid
        last_y = rect.y
        last_x = rect.x
        for x in range(self._grid-1):
            last_y += (rect.Height / self._grid)
            dc.DrawLine(rect.x, last_y, rect.x + rect.Width, last_y)
            last_x += (rect.Width / self._grid)
            dc.DrawLine(last_x, rect.y, last_x, rect.y + rect.Height)

class MyFrame(wx.Frame):
    def __init__(self):
        super(MyFrame, self).__init__(None, title="TestPaint")

        self.panel = ImagePanel(self)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.panel, 1, wx.EXPAND)
        bsizer = wx.BoxSizer(wx.HORIZONTAL)
        threebtn = wx.Button(self, label="3x3")
        sixbtn = wx.Button(self, label="6x6")
        ninebtn = wx.Button(self, label="9x9")
        bsizer.AddMany([(threebtn,0), ((5,5),0), (sixbtn,0), 
                        ((5,5),0), (ninebtn,0)])
        sizer.Add(bsizer, 0, wx.ALL, 5)
        self.SetSizer(sizer)
        self.SetInitialSize((300,300))

        # Event Handlers
        self.Bind(wx.EVT_BUTTON, lambda evt: self.panel.SetGrid(3), threebtn)
        self.Bind(wx.EVT_BUTTON, lambda evt: self.panel.SetGrid(6), sixbtn)
        self.Bind(wx.EVT_BUTTON, lambda evt: self.panel.SetGrid(9), ninebtn)

if __name__ == '__main__':
    app = wx.App(False)
    f = MyFrame()
    f.Show()
    app.MainLoop()
        
