from id import * class PaintPage(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.buffer=wx.EmptyBitmap(64, 64) self.width=self.buffer.GetWidth() self.widthf=float(self.width) self.height=self.buffer.GetHeight() self.heightf=float(self.height) self.drawing=False self.SetBackgroundColour("GRAY") self.zoom_levels=[0.5, 1, 2, 4, 8] self.zoom=1 self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftMouseDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftMouseUp) self.Bind(wx.EVT_MOTION, self.OnMouseMotion) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Bind(wx.EVT_MOUSEWHEEL, self.OnMouseWheel) self.InitTest() def InitTest(self): dc=wx.BufferedDC(wx.ClientDC(self), self.buffer) switch=0 pens=[wx.Pen('WHITE', 1.0), wx.Pen('GRAY', 1.0)] for x in xrange(self.width): if switch: switch=0 else: switch=1 for y in xrange(self.height): if switch: switch=0 else: switch=1 dc.SetPen(pens[switch]) dc.DrawPoint(x, y) self.Refresh(False) def OnPaint(self, event): blowup=self.buffer.ConvertToImage().Scale(self.width * self.zoom_levels[self.zoom], self.height * self.zoom_levels[self.zoom]).ConvertToBitmap() dc=wx.BufferedPaintDC(self, blowup)#, wx.BUFFER_CLIENT_AREA) def OnLeftMouseDown(self, event): if event.LeftDown(): self.SetFocus() self.SetXY(event) self.CaptureMouse() self.drawing=True self.OnMouseMotion(event, True) def OnLeftMouseUp(self, event): if not event.LeftDown() and self.drawing: self.ReleaseMouse() self.drawing=False def OnMouseMotion(self, event, override=False): if (event.Dragging() or override) and self.drawing: dc=wx.BufferedDC(wx.ClientDC(self), self.buffer) dc.BeginDrawing() dc.SetPen(wx.Pen('BLUE', 1.0 * (self.width * self.zoom_levels[self.zoom] / self.widthf))) dc.SetUserScale(1.0 / (self.width * self.zoom_levels[self.zoom] / self.widthf), 1.0 / (self.height * self.zoom_levels[self.zoom] / self.heightf)) coordinates=(self.x, self.y) + (event.GetX(), event.GetY()) dc.DrawLine(*coordinates) dc.EndDrawing() self.SetXY(event) self.Refresh(False) def OnMouseWheel(self, event): if event.GetWheelRotation() > 0: if self.zoom < len(self.zoom_levels)-1: self.zoom+=1 self.Refresh() else: if self.zoom > 0: self.zoom-=1 self.Refresh() def SetXY(self, event): self.x, self.y=event.GetX(), event.GetY()