wxPython实现的画图板

来源:互联网 发布:源码网easck 编辑:程序博客网 时间:2024/04/28 09:57

#coding:GBK'''Created on 2012-3-22@author: cWX53049'''import wximport timefrom bsddb.test.test_pickle import cPickleimport 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()                                                                   

	
				
		
原创粉丝点击