Table des matières
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # exemple scribblesimple.py 4 5 # GTK - The GIMP Toolkit 6 # Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald 7 # Copyright (C) 2001-2004 John Finlay 8 # 9 # This library is free software; you can redistribute it and/or 10 # modify it under the terms of the GNU Library General Public 11 # License as published by the Free Software Foundation; either 12 # version 2 of the License, or (at your option) any later version. 13 # 14 # This library is distributed in the hope that it will be useful, 15 # but WITHOUT ANY WARRANTY; without even the implied warranty of 16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 # Library General Public License for more details. 18 # 19 # You should have received a copy of the GNU Library General Public 20 # License along with this library; if not, write to the 21 # Free Software Foundation, Inc., 59 Temple Place - Suite 330, 22 # Boston, MA 02111-1307, USA. 23 24 25 import pygtk 26 pygtk.require('2.0') 27 import gtk 28 29 # Pixmap d'arrière-plan pour la zone de dessin 30 pixmap = None 31 32 # Création d'un nouveau pixmap d'arrière-plan de la taille voulue 33 def configure_event(widget, event): 34 global pixmap 35 36 x, y, largeur, hauteur = widget.get_allocation() 37 pixmap = gtk.gdk.Pixmap(widget.window, largeur, hauteur) 38 pixmap.draw_rectangle(widget.get_style().white_gc, 39 True, 0, 0, largeur, hauteur) 40 41 return True 42 43 # Redessine l'écran à partir du pixmap d'arrière-plan 44 def expose_event(widget, event): 45 x , y, largeur, hauteur = event.area 46 widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], 47 pixmap, x, y, x, y, largeur, hauteur) 48 return False 49 50 # Dessine un rectangle sur l'écran 51 def brosse_dessin(widget, x, y): 52 rect = (int(x-5), int(y-5), 10, 10) 53 pixmap.draw_rectangle(widget.get_style().black_gc, True, 54 rect[0], rect[1], rect[2], rect[3]) 55 widget.queue_draw_area(rect[0], rect[1], rect[2], rect[3]) 56 57 def bouton_press_event(widget, event): 58 if event.button == 1 and pixmap != None: 59 brosse_dessin(widget, event.x, event.y) 60 return True 61 62 def motion_notify_event(widget, event): 63 if event.is_hint: 64 x, y, etat = event.window.get_pointer() 65 else: 66 x = event.x 67 y = event.y 68 etat = event.state 69 70 if etat & gtk.gdk.BUTTON1_MASK and pixmap != None: 71 brosse_dessin(widget, x, y) 72 73 return True 74 75 def main(): 76 fenetre = gtk.Window(gtk.WINDOW_TOPLEVEL) 77 fenetre.set_name ("Test Input") 78 79 boitev = gtk.VBox(False, 0) 80 fenetre.add(boitev) 81 boitev.show() 82 83 fenetre.connect("destroy", lambda w: gtk.main_quit()) 84 85 # Création de la zone de dessin 86 zone_dessin = gtk.DrawingArea() 87 zone_dessin.set_size_request(200, 200) 88 boitev.pack_start(zone_dessin, True, True, 0) 89 90 zone_dessin.show() 91 92 # Signaux utilisés pour gérer le pixmap hors écran 93 zone_dessin.connect("expose_event", expose_event) 94 zone_dessin.connect("configure_event", configure_event) 95 96 # Signaux d'événements 97 zone_dessin.connect("motion_notify_event", motion_notify_event) 98 zone_dessin.connect("button_press_event", bouton_press_event) 99 100 zone_dessin.set_events(gtk.gdk.EXPOSURE_MASK 101 | gtk.gdk.LEAVE_NOTIFY_MASK 102 | gtk.gdk.BUTTON_PRESS_MASK 103 | gtk.gdk.POINTER_MOTION_MASK 104 | gtk.gdk.POINTER_MOTION_HINT_MASK) 105 106 # .. Et un bouton quitter 107 bouton = gtk.Button("Quit") 108 boitev.pack_start(bouton, False, False, 0) 109 110 bouton.connect_object("clicked", lambda w: w.destroy(), fenetre) 111 bouton.show() 112 113 fenetre.show() 114 115 gtk.main() 116 117 return 0 118 119 if __name__ == "__main__": 120 main()