在Python里画曲线,常常用到wx.DC(设备上下文)和wx.Pen画笔,有可能需要下面的资源:
wx.BufferedDC:用于缓存一套绘画命令,直到命令完整并准备在屏幕上绘画。这防止了显示中不必要的闪烁。
wx.BufferedPaintDC:和wx.BufferedDC一样,但是只能用在一个wx.PaintEvent的处理中。仅临时创建该类的实例。
wx.ClientDC:用于在一个窗口对象上绘画。当你想在窗口部件的主区域上(不包括边框或别的装饰)绘画时使用它。主区域有时也称为客户区。wx.ClientDC类也应临时创建。该类仅适用于wx.PaintEvent的处理之外。
wx.MemoryDC:用于绘制图形到内存中的一个位图中,此时不被显示。然后你可以选择该位图,并使用wx.DC.Blit()方法来把这个位图绘画到一个窗口中。
wx.MetafileDC:在Windows操作系统上,wx.MetafileDC使你能够去创建标准窗口图元文件数据。
wx.PaintDC:等同于wx.ClientDC,除了它仅用于一个wx.PaintEvent的处理中。仅临时创建该类的实例。
wx.PostScriptDC:用于写压缩的PostScript文件。
wx.PrinterDC:用于Windows操作系统上,写到打印机。
wx.ScreenDC:用于直接在屏幕上绘画,在任何被显示的窗口的顶部或外部。该类只应该被临时创建。
wx.WindowDC:用于在一个窗口对象的整个区域上绘画,包括边框以及那些没有被包括在客户区域中的装饰。非Windows系统可能不支持该类。
用Python绘图的案例代码:
//Huitu2.py
#-*- coding: UTF-8 -*-
import wx
class SketchWindow2(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) ##创建一个画笔对象
self.lines = []
self.curlines = []
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_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.curlines = []
self.pos = event.GetPositionTuple()
self.CaptureMouse() ##捕获鼠标
def OnLeftUp(self,event):
if self.HasCapture():
self.lines.append((self.color,
self.thickness,
self.curlines))
self.curlines = []
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.curlines.append(coords)
dc.DrawLine(*coords)
self.pos = newPos
##处理窗口放大事件
def OnSize(self,event):
self.reInitBuffer = True
def OnIdle(self,event):
if self.reInitBuffer:
self.InitBuffer()
self.Refresh(False)
##处理一个绘画请求
def OnPaint(self,event):
dc = wx.BufferedPaintDC(self,self.buffer)
##绘制所有的线条
def DrawLines(self,dc):
for colour,thickness,line in self.lines:
pen = wx.Pen(colour,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 SketchFrame(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self,parent,-1,"Sketch Frame",
size=(800,600))
self.sketch = SketchWindow2(self,-1)
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = SketchFrame(None)
frame.Show(True)
app.MainLoop()
效果如下: