wxPython实现画图板

yipeiwu_com6年前Python基础

本文实例为大家分享了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() 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持【听图阁-专注于Python设计】。

相关文章

python开启摄像头以及深度学习实现目标检测方法

最近想做实时目标检测,需要用到python开启摄像头,我手上只有两个uvc免驱的摄像头,性能一般。利用python开启摄像头费了一番功夫,主要原因是我的摄像头都不能用cv2的VideCa...

python简单操作excle的方法

Python操作Excle文件:使用xlwt库将数据写入Excel表格,使用xlrd 库从Excel读取数据。 从excle读取数据存入数据库 1、导入模块: import xlrd...

Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

前言 matplotlib.pyplot是一些命令行风格函数的集合,使matplotlib以类似于MATLAB的方式工作。每个pyplot函数对一幅图片(figure)做一些改动:比如创...

Python的socket模块源码中的一些实现要点分析

BaseServer 和 BaseRequestHandler Python为网络编程提高了更高级的封装。SocketServer.py 提供了不少网络服务的类。它们的设计很优雅。Pyt...

简单理解Python中的装饰器

Python的装饰器可以实现在代码运行期间修改函数的上下文, 即可以定义函数在执行之前进行何种操作和函数执行后进行何种操作, 而函数本身并没有任何的改变。 首先, 我们先定义一个函数,...