PyGTK - Classe DrawingArea

Il widget DrawingArea presenta una tela vuota contenente una gtk.gdk.Window su cui è possibile disegnare oggetti come linea, rettangolo, arco, ecc.

PyGTK usa la libreria Cairo per tali operazioni di disegno. Cairo è una popolare libreria di grafica vettoriale 2D. È scritto in C., sebbene abbia collegamenti nella maggior parte dei linguaggi come C ++, Java, Python, PHP ecc. La libreria Cairo può essere utilizzata per disegnare su dispositivi di output standard in vari sistemi operativi. Può anche essere utilizzato per creare file PDF, SVG e post-script.

Per eseguire diverse operazioni di disegno, dobbiamo recuperare il dispositivo sul testo dell'oggetto di output di destinazione. In questo caso, poiché il disegno appare nel widget gtk.DrawingArea, si ottiene il device context di gdk.Window contenuto al suo interno. Questa classe ha un filecairo-create() metodo che restituisce il contesto del dispositivo.

area = gtk.DrawingArea()
dc = area.window.cairo_create()

Il widget DrawingArea può essere collegato ai callback in base ai seguenti segnali emessi da esso:

Rendersi conto Per eseguire le azioni necessarie quando il widget viene istanziato su un particolare display.
configure_event Per eseguire le azioni necessarie quando il widget cambia dimensione.
expose_event Per gestire il ridisegno del contenuto del widget quando un'area di disegno viene visualizzata per la prima volta sullo schermo o quando è coperta da un'altra finestra e quindi scoperta (esposta).

Gli eventi Mouse e Keyboard possono essere utilizzati anche per richiamare i callback di add_events() method del gtk.Widget class.

Di particolare interesse è il segnale dell'evento di esposizione che viene emesso quando viene visualizzata per la prima volta l'area di disegno DrawingArea. I diversi metodi per disegnare oggetti 2D, definiti nella libreria Cairo, vengono richiamati da questo callback connesso al segnale dell'evento di esposizione. Questi metodi disegnano gli oggetti corrispondenti nel contesto del dispositivo Cairo.

I seguenti sono i metodi di disegno disponibili:

  • dc.rectangle (x, y, w, h) - Questo disegna un rettangolo alla coordinata in alto a sinistra specificata e con larghezza e altezza date.

  • dc.arc (x, y, r, a1, a2) - Disegna un arco circolare con un dato raggio e due angoli.

  • dc.line (x1, y1, x2, y2) - Disegna una linea tra due coppie di coordinate.

  • dc.line_to (x, y) - Disegna una linea dalla posizione corrente a (x, y)

  • dc.show_text (str) - disegna la stringa nella posizione corrente del cursore

  • dc.stroke () - disegna i contorni

  • dc.fill () - riempie la forma con il colore corrente

  • dc.set_color_rgb (r, g, b) - imposta il colore sul contorno e riempie con valori r, ge b compresi tra 0,0 e 1,0

Esempio

Lo script seguente disegna forme diverse e prova utilizzando i metodi Cairo.

import gtk
import math

class PyApp(gtk.Window):
   
   def __init__(self):
      super(PyApp, self).__init__()
      
	  self.set_title("Basic shapes using Cairo")
      self.set_size_request(400, 250)
      self.set_position(gtk.WIN_POS_CENTER)
      
	  self.connect("destroy", gtk.main_quit)
		
      darea = gtk.DrawingArea()
      darea.connect("expose-event", self.expose)
		
      self.add(darea)
      self.show_all()
		
      def expose(self, widget, event):
      cr = widget.window.cairo_create()
		
      cr.set_line_width(2)
      cr.set_source_rgb(0,0,1)
      cr.rectangle(10,10,100,100)
      cr.stroke()
		
      cr.set_source_rgb(1,0,0)
      cr.rectangle(10,125,100,100)
      cr.stroke()
		
      cr.set_source_rgb(0,1,0)
      cr.rectangle(125,10,100,100)
      cr.fill()
		
      cr.set_source_rgb(0.5,0.6,0.7)
      cr.rectangle(125,125,100,100)
      cr.fill()
		
      cr.arc(300, 50, 50,0, 2*math.pi)
      cr.set_source_rgb(0.2,0.2,0.2)
      cr.fill()
		
      cr.arc(300, 200, 50, math.pi,0)
      cr.set_source_rgb(0.1,0.1,0.1)
      cr.stroke()
		
      cr.move_to(50,240)
      cr.show_text("Hello PyGTK")
      cr.move_to(150,240)
      cr.line_to(400,240)
      cr.stroke()

PyApp()
gtk.main()

Lo script sopra genererà il seguente output: