wxPython实现画图板
人气:0#coding:GBK ''' Created on 2012-3-22 @author: cWX53049 ''' import wx import time from bsddb.test.test_pickle import cPickle import os _formatStr="%Y-%m-%d %H:%M:%S" class SkethWindow(wx.Window): def __init__(self,parent,ID): wx.Window.__init__(self,parent,ID) self.SetBackgroundColour("White") self.color="Black" self.thickness=1 self.pen=wx.Pen(self.color,self.thickness,wx.SOLID)#创建一个pen self.lines=[] self.curLine=[] self.pos=(0,0) self.InitBuffer() self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_SIZE, self.OnSize) self.Bind(wx.EVT_IDLE,self.OnIdle) self.Bind(wx.EVT_PAINT, self.OnPaint) def InitBuffer(self): size = self.GetClientSize() self.buffer=wx.EmptyBitmap(size.width,size.height) dc = wx.BufferedDC(None,self.buffer) dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() self.DrawLines(dc) self.reInitBuffer=False def GetLinesData(self): return self.lines[:] def SetLinesData(self,lines): self.lines = lines[:] self.InitBuffer() self.Refresh() def OnLeftDown(self,event): self.curLine=[] self.pos=event.GetPositionTuple()#得到鼠标的位置 self.CaptureMouse()#捕获鼠标 def OnLeftUp(self,event): if self.HasCapture(): self.lines.append((self.color, self.thickness, self.curLine)) self.curLine=[] self.ReleaseMouse()#释放鼠标 def OnMotion(self,event): if event.Dragging() and event.LeftIsDown():#确定是否在拖动 dc = wx.BufferedDC(wx.ClientDC(self),self.buffer)#创建另一个 self.drawMotion(dc,event) event.Skip() def drawMotion(self,dc,event): dc.SetPen(self.pen) newPos=event.GetPositionTuple() coords=self.pos+newPos self.curLine.append(coords) dc.DrawLine(*coords) self.pos=newPos def OnSize(self,event): self.reInitBuffer=True#处理一个resize事件 def OnIdle(self,event): if self.reInitBuffer: self.InitBuffer() self.Refresh() def OnPaint(self,event): wx.BufferedPaintDC(self,self.buffer) def DrawLines(self,dc): for colur,thickness,line in self.lines: pen = wx.Pen(colur,thickness,wx.SOLID) dc.SetPen(pen) for coords in line: dc.DrawLine(*coords) def SetColor(self,color): self.color = color self.pen = wx.Pen(self.color,self.thickness,wx.SOLID) def SetThickness(self,num): self.thickness=num self.pen=wx.Pen(self.color,self.thickness,wx.SOLID) class SkethFrame(wx.Frame): def __init__(self,parent): self.title="绘画窗体" wx.Frame.__init__(self,parent,-1,self.title,size=(500,500)) self.sketh=SkethWindow(self,-1) self.InitStatusBar() self.sketh.Bind(wx.EVT_MOTION, self.showPosition) self.initMenuBar() self.wildcard="Sketch file(*.sketch)|All files(*.*)|*.*" self.fileName="" def OnNew(self,event): pass def OnOpen(self,event): pass def OnSave(self,event): if not self.fileName: self.OnSaveAs(event) else: self.SaveFile() def SaveFile(self): if self.fileName: data = self.sketh.GetLinesData() f = open(self.fileName,'w') cPickle.dump(data, f) f.close() def OnSaveAs(self,event): dlf = wx.FileDialog(self,"Sketch file",os.getcwd(),style=wx.SAVE|wx.OVERWRITE_PROMPT) if dlf.ShowModal()==wx.ID_OK: fileName = dlf.GetPath() if not os.path.splitext(fileName)[1]: fileName=fileName+'.sketch' self.fileName=fileName self.SaveFile() self.SetTitle(self.title+'--'+self.fileName) dlf.Destroy() def OnColor(self,event): pass def OnCloseWindow(self,event): self.Destroy() def menuData(self): return [("&File",( ("&New","New Sketch file",self.OnNew), ("&Open","open sketch file",self.OnOpen), ("&Save","save sktech file",self.OnSave), ("","",""), ("&Color",( ("&Black","",self.OnColor,wx.ITEM_RADIO), ("&Red","",self.OnColor,wx.ITEM_RADIO), ("&Red","",self.OnColor,wx.ITEM_RADIO), ("&Blue","",self.OnColor,wx.ITEM_RADIO))), ("","",""), ("&Quit","quit sketch ",self.OnCloseWindow)))] def initMenuBar(self): menuBar=wx.MenuBar() for eachMenu in self.menuData(): eachMenuLabel = eachMenu[0] eachMenuItems = eachMenu[1] menuBar.Append(self.createMenu(eachMenuItems),eachMenuLabel) self.SetMenuBar(menuBar) def createMenu(self,menuData): menu = wx.Menu() for eachMenu in menuData: if len(eachMenu)==2: label = eachMenu[0] subBar =self.createMenu(eachMenu[1]) menu.AppendMenu(wx.NewId(),label,subBar) else: self.createMenuItem(menu,*eachMenu) return menu def createMenuItem(self,menu,label,status,handler,kind=wx.ITEM_NORMAL): if not label: menu.AppendSeparator() return menuItem=menu.Append(-1,label,status,kind) self.Bind(wx.EVT_MENU,handler,menuItem) def InitStatusBar(self): self.statusBar=self.CreateStatusBar() self.statusBar.SetFieldsCount(4) self.statusBar.SetStatusWidths([-1,-2,-2,-2]) self.timer=wx.Timer(self) self.Bind(wx.EVT_TIMER, self.updateTime, self.timer) self.timer.Start(1000) self.statusBar.SetStatusText("Time is %s"%time.strftime(_formatStr,time.localtime()),3) self.statusBar.SetStatusText("Pos (0,0)",1) self.statusBar.SetStatusText("Cur Line 0",2) self.statusBar.SetStatusText("Lines 0" ,3) def showPosition(self,event): self.statusBar.SetStatusText("Pos %s"%str(event.GetPositionTuple()),0) self.statusBar.SetStatusText("Cur Line %s"%len(self.sketh.curLine),1) self.statusBar.SetStatusText("Lines %s"%len(self.sketh.lines),2) event.Skip() def updateTime(self,event): self.statusBar.SetStatusText("Time is %s"%time.strftime(_formatStr,time.localtime()),3) if __name__=="__main__": app = wx.PySimpleApp(False) frame=SkethFrame(None) frame.Center() frame.Show(True) app.MainLoop()
您可能感兴趣的文章:
加载全部内容