wxPython实现画图板


Posted in Python onAugust 27, 2020

本文实例为大家分享了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实现画图板

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

Python 相关文章推荐
Python中__init__和__new__的区别详解
Jul 09 Python
Python写的Tkinter程序屏幕居中方法
Mar 10 Python
Python中atexit模块的基本使用示例
Jul 08 Python
Python爬取国外天气预报网站的方法
Jul 10 Python
Python基于列表list实现的CRUD操作功能示例
Jan 05 Python
Python爬虫中urllib库的进阶学习
Jan 05 Python
python_opencv用线段画封闭矩形的实例
Dec 05 Python
python判断字符串或者集合是否为空的实例
Jan 23 Python
python反编译学习之字节码详解
May 19 Python
基于Python检测动态物体颜色过程解析
Dec 04 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
Python新手学习raise用法
Jun 03 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 #Python
Python高级特性之闭包与装饰器实例详解
Nov 19 #Python
Python高级编程之继承问题详解(super与mro)
Nov 19 #Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 #Python
Python csv文件的读写操作实例详解
Nov 19 #Python
Python高级property属性用法实例分析
Nov 19 #Python
wxPython之wx.DC绘制形状
Nov 19 #Python
You might like
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php用ini_get获取php.ini里变量值的方法
2015/03/04 PHP
详解PHP的Yii框架中日志的相关配置及使用
2015/12/08 PHP
laravel按天、按小时,查询数据的实例
2019/10/09 PHP
懒就要懒到底——鼠标自动点击(含时间判断)
2007/02/20 Javascript
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
通过javascript设置css属性的代码
2009/12/28 Javascript
javascript延时加载之defer测试
2012/12/28 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
使用jquery的ajax需要注意的地方dataType的设置
2013/08/12 Javascript
JavaScript弹出对话框的三种方式
2016/03/23 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
纯js实现的积木(div层)拖动功能示例
2017/07/19 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
微信小程序进入广告实现代码实例
2019/09/19 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
js实现无缝轮播图
2020/03/09 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
vue中keep-alive内置组件缓存的实例代码
2020/04/16 Javascript
Python使用PyCrypto实现AES加密功能示例
2017/05/22 Python
Python设计模式之桥接模式原理与用法实例分析
2019/01/10 Python
解析python的局部变量和全局变量
2019/08/15 Python
使用Python给头像戴上圣诞帽的图像操作过程解析
2019/09/20 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
2020/06/17 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
CSS3 特效范例整理
2011/08/22 HTML / CSS
HTML5 Canvas像素处理使用接口介绍
2012/12/02 HTML / CSS
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
投资合作协议书
2014/04/17 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
法定代表人资格证明书
2015/06/18 职场文书
情况说明书怎么写
2015/10/08 职场文书
python 办公自动化——基于pyqt5和openpyxl统计符合要求的名单
2021/05/25 Python
浅谈Golang 切片(slice)扩容机制的原理
2021/06/09 Golang