1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
| #! /usr/bin/env python
#-*- coding: utf-8 -*-
import wx
class Canvas(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent, -1, style=wx.SUNKEN_BORDER)
self.SetBackgroundColour(wx.WHITE)
self.lines = []
self.x = self.y = 0
self.SetMode("Draw")
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)
self.Bind(wx.EVT_RIGHT_UP, self.OnRightUp)
self.Bind(wx.EVT_MOTION, self.OnMotion)
self.Bind(wx.EVT_PAINT, self.OnPaint)
def SetMode(self, mode):
self.mode = mode
if self.mode == "Draw":
self.SetCursor(wx.StockCursor(wx.CURSOR_PENCIL))
else:
self.SetCursor(wx.STANDARD_CURSOR)
def OnPaint(self, event):
dc = wx.PaintDC(self)
self.DrawSavedLines(dc)
def DrawSavedLines(self, dc):
dc.BeginDrawing()
dc.SetPen(wx.Pen(wx.BLUE, 3))
for line in self.lines:
for coords in line:
dc.DrawLine(*coords)
dc.EndDrawing()
def OnLeftDown(self, event):
if self.mode == "Draw":
self.curLine = []
self.x, self.y = event.GetPositionTuple()
self.CaptureMouse()
def OnLeftUp(self, event):
if self.HasCapture():
self.lines.append(self.curLine)
self.curLine = []
self.ReleaseMouse()
def OnRightUp(self, event):
self.lines = []
self.Refresh()
def OnMotion(self, event):
if self.HasCapture():
dc = wx.ClientDC(self)
dc.BeginDrawing()
dc.SetPen(wx.Pen(wx.BLUE, 3))
coords = (self.x, self.y) + event.GetPositionTuple()
self.curLine.append(coords)
dc.DrawLine(*coords)
self.x, self.y = event.GetPositionTuple()
dc.EndDrawing()
class MyFrame(wx.Frame):
def __init__(self, title):
wx.Frame.__init__(self, None, -1, title=title, size=(400, 400))
self.menuDoc = wx.Menu()
self.menuFichier = wx.Menu()
menuBar = wx.MenuBar()
item = wx.MenuItem(self.menuFichier, id = -1, text = u"Enregistrer", help = u"Enregistrer l'image")
self.ID_SAVE = item.GetId()
self.menuFichier.AppendItem(item)
item = wx.MenuItem(self.menuDoc, id = -1, text = u"Quitter", help = u"Quitter l'application")
self.ID_QUIT = item.GetId()
self.menuFichier.AppendItem(item)
menuBar.Append(self.menuFichier, u"Fichier")
self.SetMenuBar(menuBar)
statBar = wx.StatusBar(self)
self.SetStatusBar(statBar)
sizer = wx.BoxSizer(wx.VERTICAL)
self.canvas = Canvas(self)
sizer.Add(self.canvas, 1, wx.EXPAND)
self.SetSizer(sizer)
self.SetAutoLayout(True)
wx.EVT_MENU(self, self.ID_SAVE, self.Save)
wx.EVT_MENU(self, self.ID_QUIT, self.Quit)
self.Bind(wx.EVT_CLOSE, self.Quit)
def Quit(self, event):
self.Destroy()
def Save(self, event):
imDC = wx.ClientDC(self.canvas)
l, h = self.canvas.GetClientSizeTuple()
bmp = wx.EmptyBitmap(l, h)
DC = wx.MemoryDC(bmp)
DC.Blit(0, 0, l, h, imDC, 0, 0)
bmp.SaveFile("test.png", wx.BITMAP_TYPE_PNG)
class MyApp(wx.App):
def OnInit(self):
f = MyFrame("Test")
f.Show(True)
self.SetTopWindow(f)
return True
app = MyApp()
app.MainLoop() |
Partager