| 12
 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