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 相关文章推荐
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python基础教程之浅拷贝和深拷贝实例详解
Jul 15 Python
python3实现windows下同名进程监控
Jun 21 Python
flask框架实现连接sqlite3数据库的方法分析
Jul 16 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
python3读取csv文件任意行列代码实例
Jan 13 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
Mar 27 Python
TensorFlow打印输出tensor的值
Apr 19 Python
Python读取xlsx数据生成图标代码实例
Aug 12 Python
opencv深入浅出了解机器学习和深度学习
Mar 17 Python
python实现学员管理系统(面向对象版)
Jun 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
解析CI的AJAX分页 另类实现方法
2013/06/27 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
wamp安装后自定义配置的方法
2014/08/23 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
Zend Framework动作助手FlashMessenger用法详解
2016/03/05 PHP
Composer设置忽略版本匹配的方法
2016/04/27 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
详解PHP版本兼容之openssl调用参数
2018/07/25 PHP
使用js获取QueryString的方法小结
2010/02/28 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
自动完成的搜索框javascript实现
2016/02/26 Javascript
使用BootStrap实现标签切换原理解析
2017/03/14 Javascript
Angular4学习笔记之准备和环境搭建项目
2017/08/01 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
JS实现带动画的回到顶部效果
2017/12/28 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
vsCode安装使用教程和插件安装方法
2020/08/24 Javascript
Vuex 单状态库与多模块状态库详解
2018/12/11 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
Django Admin 实现外键过滤的方法
2017/09/29 Python
python 循环数据赋值实例
2019/12/02 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python基于stuck实现scoket文件传输
2020/04/02 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
大学自我鉴定
2013/12/20 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
洗手间标语
2014/06/23 职场文书
领导班子整改措施
2014/10/24 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
TensorFlow中tf.batch_matmul()的用法
2021/06/02 Python