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实现目录树生成示例
Mar 28 Python
Python使用百度API上传文件到百度网盘代码分享
Nov 08 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
浅谈Python基础—判断和循环
Mar 22 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
matplotlib 曲线图 和 折线图 plt.plot()实例
Apr 17 Python
Python计算信息熵实例
Jun 18 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP+jQuery实现自动补全功能源码
2013/05/15 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
Yii视图CGridView实现操作按钮定义地址示例
2016/07/14 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
阿里云PHP SMS短信服务验证码发送方法
2017/07/11 PHP
php微信开发之谷歌测距
2018/06/14 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
JSON 和 JavaScript eval使用说明
2010/06/13 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
JavaScript闭包和回调详解
2017/08/09 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
基于jquery实现五星好评
2017/11/18 jQuery
swiper自定义分页器使用方法详解
2020/09/14 Javascript
JavaScript中call和apply方法的区别实例分析
2018/08/03 Javascript
vue实现拖拽效果
2019/12/23 Javascript
vue-axios同时请求多个接口 等所有接口全部加载完成再处理操作
2020/11/09 Javascript
原生JavaScript实现留言板
2021/01/10 Javascript
在Python中调用ggplot的三种方法
2015/04/08 Python
在Python程序中进行文件读取和写入操作的教程
2015/04/28 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
python数据化运营的重要意义
2019/11/25 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Django高并发负载均衡实现原理详解
2020/04/04 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
2020/09/01 Python
世界上最大的网络主机公司:1&1
2016/10/12 全球购物
施华洛世奇加拿大官网:SWAROVSKI加拿大
2018/06/03 全球购物
PHP中如何使用Cookie
2015/10/28 面试题
new修饰符是起什么作用
2015/06/28 面试题
教师自我评价范文
2013/12/16 职场文书
2014领导干部四风问题查摆思想汇报
2014/09/13 职场文书
志愿服务心得体会
2016/01/15 职场文书
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
Python中第三方库Faker的使用详解
2022/04/02 Python