Vous êtes à peu près ici : Accueil  »   tutoriel PyGTK  »   PyGTK : sommaire

Chapitre 12. La zone de dessin (Drawing Area)

Table des matières

12.1. Le contexte graphique
12.2. Les méthodes pour dessiner

La zone de dessin DrawingArea adapte une gtk.gdk.Window, laquelle est une sous-classe de gtk.gdk.Drawable (de même que gtk.gdk.Pixmap). En effet, la DrawingArea fournit un simple "canevas" (la gtk.gdk.Window adaptée) sur laquelle on peut dessiner en utilisant les méthodes de la classe gtk.gdk.Drawable.

On crée une DrawingArea en utilisant le constructeur :

  zone_dessin = gtk.DrawingArea()

Une DrawingArea est créée au départ avec une taille de (0, 0) donc pour rendre visible la zone_dessin, il faut préciser sa largeur et sa hauteur avec des valeurs supérieures à zéro en utilisant la méthode suivante :

  zone_dessin.set_size_request(largeur, hauteur)

Pour dessiner sur une DrawingArea, il faut récupérer la gtk.gdk.Window en utilisant l'attribut window de la zone de dessin de cette manière :

  dessinable = drawing_area.window

Ensuite, il est possible de dessiner sur le dessinable en utilisant la méthode gtk.gdk.Drawable décrite dans la Section 12.2, « Les méthodes pour dessiner ».

Note

Pour posséder une gtk.gdk.Window associée pouvant être utilisée pour le dessin, le widget DrawingArea doit être "réalisé" (on a utilisé la méthode realize()).

12.1. Le contexte graphique

Il existe un grand nombre de méthodes pour dessiner sur la gtk.gdk.Window d'une zone de dessin . Toutes ces méthodes exigent un contexte graphique (gtk.gdk.GC) pour encapsuler l'information nécessaire au dessin sous forme d'attributs. Un gtk.gdk.GC dispose des attributs suivants :

background            # fond
cap_style             # style de fin de ligne
clip_mask             # masque de découpe
clip_x_origin         # origine x de la découpe
clip_y_origin         # origine y de la découpe
fill                  # remplissage
font                  # police
foreground            # couleur de premier plan
function              # fonction
graphics_exposures    # exposition graphique
join_style            # style de jointure de lignes
line_style            # style de ligne
line_width            # largeur de ligne
stipple               # style de pointillé
sub_window            # sous-fenêtre
tile                  # mosaïque
ts_x_origin           # origine x
ts_y_origin           # origine y

background définit la gtk.gdk.Color utilisée comme couleur de fond.

foreground définit la gtk.gdk.Color utilisée comme couleur de premier-plan.

Une gtk.gdk.Color est une couleur qui peut être allouée ou non allouée. Une couleur non allouée peut être créée avec le constructeur :

  couleur = gtk.gdk.Color(red=0, green=0, blue=0, pixel=0)

... où les paramètres red, green et blue sont des entiers compris entre 0 et 65535. Le paramètre pixel n'est pas souvent défini car il est réécrit lorsque la couleur est allouée.

Une gtk.gdk.Color non allouée peut aussi être créée par la fonction :

  couleur = gtk.gdk.color_parse(spec)

... où spec est une chaîne de spécification de couleur qui peut être :

  • un nom de couleur (par exemple "red", "orange", "navajo white" tels qu'ils sont définis dans le fichier X Window rgb.txt), oo
  • une chaîne hexadécimale débutant par '#' et contenant trois groupes des chiffres hexa de même longueur ((1, 2, 3 or 4 chiffres). Par exemple, "#F0A", "#FF00AA", "#FFF000AAA" and "#FFFF0000AAAA" qui représentent tous la même couleur.

Pour créer une gtk.gdk.Color représentant une couleur allouée, on utilise la méthode alloc_color() de gtk.gdk.Colormap qui possède trois variantes :

  couleur = colormap.alloc_color(color, writeable=FALSE, best_match=TRUE)

  couleur = colormap.alloc_color(spec, writeable=FALSE, best_match=TRUE)

  couleur = colormap.alloc_color(red, green, blue, writeable=FALSE, best_match=TRUE)

Le paramètre couleur est un gtk.gdk.Color non alloué, spec est une chaîne de spécification de couleur comme on l'a vu précèdemment dans la fonction gtk.gdk.color_parse(). Les paramètres red, green et blue sont des valeurs entières de couleur décrites dans la fonction constructeur gtk.gdk.Color(). On peut aussi indiquer si la couleur allouée peut être modifiable (cad, peut être modifiée plus tard mais ne peut pas être partagée) ou si une meilleure approximation avec des couleurs existantes peut se faire lorsque la couleur exacte n'est pas disponible.

Par exemple:

  navajowhite = colormap.alloc('navajo white')

  cyan = colormap.alloc(0, 65535, 65535)

  red = colormap.alloc_color('#FF0000', True, True)

On peut connaître la palette de couleurs associée à un widget par la méthode :

  palette = widget.get_colormap()

cap_style précise le style de fin de ligne utilisé pour une ligne qui se termine sans rejoindre une autre. Les différents styles disponibles sont :

CAP_NOT_LAST dessine la même fin de ligne que CAP_BUTT pour des lignes de largeur non nulle. Pour des lignes de largeur nulle, le point final de la ligne n'est pas dessiné.
CAP_BUTT la fin de ligne est carrée et étendue jusqu'aux coordonées du point final.
CAP_ROUND la fin de ligne est arrondie (demi-cercle d'un diamétre égal à l'épaisseur de la ligne) et centrée sur le point final.
CAP_PROJECTING la fin de ligne est carrée et étendue de la moitié de l'épaisseur de la ligne après le point final.

clip_mask définit un gtk.gdk.Pixmap utilisé pour découper le dessin de la zone de dessin drawing_area.

clip_x_origin et clip_y_origin précise pour le découpage, l'origine en x et y par rapport au coin supérieur gauche de la zone de dessin

fill précise le style de remplissage utilisé dans le dessin. Les styles disponibles sont :

SOLID dessine avec la couleur de premier plan.
TILED dessine avec un dessin en mosaïque.
STIPPLED dessine avec un patron de pointillé. Les pixels définis qui correspondent aux bits dans le patron seront dessinés dans la couleur de premier plan ; les pixels non définis qui correspondent aux bits dans le patron seront laissés intacts.
OPAQUE_STIPPLED dessine avec un patron de pointillé. Les pixels correspondants aux bits. Les pixels définis qui correspondent aux bits dans le patron seront dessinés dans la couleur de premier plan ; les pixels non définis qui correspondent aux bits dans le patron seront dessinés dans la couleur d'arrière-plan (de fond).

font est un gtk.gdk.Font qui est la police utilisée par défaut pour le texte du dessin.

Note

L'utilisation de l'attribut font est abandonnée.

function précise comment les valeurs de bit pour les pixels source sont combinées avec les valeurs de bit pour les pixels de destination pour produire les bits de pixels résultat. Les seize valeurs suivantes correspondent aux 16 différentes possibilités d'une table de vérité 2x2 mais deux ou trois de ces valeurs seulement sont réellement utiles. Pour les images en couleur, seul COPY, XOR et INVERT sont généralement utiles alors que pour les bitmaps AND et OR sont aussi utilisés. Voici les valeurs possibles de function :

  COPY           # copie
  INVERT         # inverser
  XOR            # OU exclusif
  CLEAR          # nettoyer
  AND            # ET
  AND_REVERSE    
  AND_INVERT     # ET inversé
  NOOP           # nul
  OR             # OU
  EQUIV          # équivalent
  OR_REVERSE     
  COPY_INVERT    # copie inversée
  OR_INVERT      # OU inversé
  NAND           # non ET
  SET            # afficher ?

graphics_exposures indique si l'affichage graphique est autorisé (TRUE) ou interdit (FALSE). Lorsque graphics_exposures vaut TRUE, l'échec de copie d'un pixel dans une action de dessin génère un évènement expose. Si la copie réussit, un évènement noexpose est généré.

join_style indique le style de croisement entre deux lignes. Les styles diponibles sont :

JOIN_MITER Les cotés de chaque ligne sont prolongés pour se rencontrer en formant un angle.
JOIN_ROUND Les cotés des deux lignes se rejoignent en formant un arrondi.
JOIN_BEVEL Les cotés des deux lignes sont joints par un segment formant un angle égal avec chaque ligne.

line_style indique le style de traçage d'une ligne. Les possibilités sont :

LINE_SOLID les lignes sont tracées en continu.
LINE_ON_OFF_DASH les segments pairs sont dessinés, pas les segment impairs (ligne discontinue).
LINE_DOUBLE_DASH les segments pairs sont dessinés normalement. Les segment impairs sont dessinés dans la couleur de fond si le style de remplissage est SOLID, dans la couleur de fond avec le masque de pointillé si le style est STIPPLED.

line_width indique l'épaisseur de la ligne.

stipple indique le gtk.gdk.Pixmap utilisé pour un dessin en pointillé quand le paramètre fill vaut STIPPLED ou OPAQUE_STIPPLED.

sub_window indique le mode de dessin dans une gtk.gdk.Window qui possède des enfants gtk.gdk.Window. Les valeurs possibles pour sub_window sont :

CLIP_BY_CHILDREN dessine seulement dans la fenêtre elle-même, pas dans ses fenêtres enfants.
INCLUDE_INFERIORS dessine dans la fenêtre et dans ses fenêtres enfants.

tile indique le gtk.gdk.Pixmap utilisé pour dessiner en mosaïque lorsque le paramètre fill vaut TILED.

ts_x_origin et ts_y_origin indiquent l'origine de la mosaïque ou du pointillé (la position de départ du bitmap).

Un nouveau contexte graphique est créé par un appel à la méthode gtk.gdk.Drawable.new_gc() :

contexte_graph = drawable.new_gc(foreground=None, background=None, font=None, 
                     function=-1, fill=-1, tile=None,
                     stipple=None, clip_mask=None, subwindow_mode=-1,
                     ts_x_origin=-1, ts_y_origin=-1, clip_x_origin=-1,
                     clip_y_origin=-1, graphics_exposures=-1,
                     line_width=-1, line_style=-1, cap_style=-1
                     join_style=-1)

Pour pouvoir créer un nouveau contexte graphique avec cette méthode, le drawable doit être :

  • une gtk.gdk.Window qui a été réalisée (créée), ou

  • un gtk.gdk.Pixmap associé à une gtk.gdk.Window réalisée.

Les différents attributs du contexte graphique possédent des valeurs par défaut lorsqu'elles ne sont pas précisées dans la méthode new_gc(). Lorsque l'on souhaite définir des attributs du contexte graphique par la méthode new_gc(), il est plus facile d'utiliser les arguments par mots-clés de Python.

On peut aussi définir les attributs individuels d'un gtk.gdk.GC en assignant une valeur aux attributs de l'objet GC. Par exemple

  gc.cap_style = CAP_BUTT
  gc.line_width = 10
  gc.fill = SOLD
  gc.foreground = macouleur

ou en utilisant les méthodes suivantes :

  gc.set_foreground(color)
  gc.set_background(color)
  gc.set_function(function)
  gc.set_fill(fill)
  gc.set_tile(tile)
  gc.set_stipple(stipple)
  gc.set_ts_origin(x, y)
  gc.set_clip_origin(x, y)
  gc.set_clip_mask(mask)
  gc.set_clip_rectangle(rectangle)
  gc.set_subwindow(mode)
  gc.set_exposures(exposures)
  gc.set_line_attributes(line_width, line_style, cap_style, join_style)

Le patron de segments utilisé lorsque le paramètre de style de ligne line_style est LINE_ON_OFF_DASH ou LINE_DOUBLE_DASH peut être défini par la méthode suivante :

  gc.set_dashes(offset, dash_list)

... où le paramètre offset est la position de la valeur du segment initial dans la dash_list et dash_list est une liste de tuples contenant le nombre de pixels à dessiner ou sauter pour réaliser les segments. Les segments sont dessinés en démarrant avec le nombre de pixels indiqué à la position de décalage (offset) ; ensuite le nombre suivant est le nombre de pixels sautés ; le nombre suivant est le nombre de pixels dessinés, et ainsi de suite, parcourant tous les nombres de la dash_list en recommençant au début quand on arrive à la fin de la liste. Par exemple, si la dash_list se compose de (2, 4, 8, 16) avec un décalage (offset) de 1, les segments sont dessinés ainsi : dessin sur 4 pixels, saut de 8 pixels, dessin sur 16 pixels, saut de 2 pixels, dessin sur 4 pixels etc.

On peut réaliser une copie d'un gtk.gdk.GC existant par la méthode :

  gc.copy(src_gc)

Les attributs du paramètre gc sont identiques à ceux du source src_gc.