python

超轻量级php框架startmvc

wxPython实现画图板

更新时间:2020-08-08 16:00:01 作者:startmvc
本文实例为大家分享了wxPython画图板展示的具体代码,供大家参考,具体内容如下#coding:GBK''

本文实例为大家分享了wxPython画图板展示的具体代码,供大家参考,具体内容如下


#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() 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

wxPython 画图板