wxPython实现的画图板

原创 2012年03月22日 20:08:33

#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: 简单的绘图例子

一个绘图的例子: #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Function:绘图 Input:NONE Outp...
  • dyx1024
  • dyx1024
  • 2012年08月14日 21:29
  • 3537

wxPython绘图

使用设备上下文 设备上下文用来在wxPython窗口部件上绘画,它应该是局部的,临时性的,不应该以实例变量、全局变量或其它形式在方法调用之间保留。在某些平台上,设备上下文是有限的资源,长期持有wx....

wxpython 之 GDI(一)

wxpython 之 GDI(一) GDI (图形设备接口) 是与图形界面交互的接口。它用于与图形设备如显示器、 打印机或文件进行交互。GDI 允许程序员在屏幕或打印机上显示数据,而不必关心...

wxPython的基础教程

写在前面的话:上个假期学习了python,发现它真的是一门很有趣的语言,所以这学期想学一些python的可视化编程,于是选择了wxPython。但是我在网上找中文教程找了好久都没有找到中文的教程(额,...

wxpython绘图例子(避免窗口闪烁)

#!/usr/bin/env python # -*- coding: utf-8 -*- '''     Function:绘图     Input:NONE     Output...

使用wxPython的绘图模块wxPyPlot进行数据可视化

[python] view plaincopy #-*- coding: utf-8 -*-       ##############################...

使用wxPython的绘图模块wxPyPlot进行数据可视化

#-*- coding: utf-8 -*- #############################################################################...

Java基础之简单画图板的实现

Java基础之简单画图板的实现 不难理解,画图板就是主要用鼠标的各种操作实现在窗体界面上绘图。所以实现一个简单的画图板,就必须先有一个事件源对象(窗体界面),为了更加美观,再在窗体界面上实例化两个面...

画图板的多图形的实现

import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Flow...

画图板的简单实现

import java.awt.FlowLayout; import java.awt.Graphics; import javax.swing.ButtonGroup; import java...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:wxPython实现的画图板
举报原因:
原因补充:

(最多只允许输入30个字)