PyGTK - klasa DrawingArea

Widżet DrawingArea przedstawia puste płótno zawierające okno gtk.gdk.Window, na którym można rysować obiekty, takie jak linia, prostokąt, łuk itp.

PyGTK używa biblioteki Cairo do takich operacji rysowania. Cairo to popularna biblioteka grafiki wektorowej 2D. Jest napisany w C., chociaż ma powiązania w większości języków, takich jak C ++, Java, Python, PHP itp. Biblioteka Cairo może być używana do rysowania na standardowych urządzeniach wyjściowych w różnych systemach operacyjnych. Może być również używany do tworzenia plików PDF, SVG i post-skryptowych.

Aby wykonać różne operacje rysowania, musimy pobrać urządzenie na tekście docelowego obiektu wyjściowego. W tym przypadku, ponieważ rysunek pojawia się na widżecie gtk.DrawingArea, jest pobierany kontekst urządzenia gdk.Window zawarty w nim. Ta klasa macairo-create() metoda, która zwraca kontekst urządzenia.

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

Widżet DrawingArea można połączyć z wywołaniami zwrotnymi na podstawie emitowanych przez niego sygnałów:

Realizować Aby podjąć wszelkie niezbędne działania, gdy widget zostanie utworzony na określonym ekranie.
configure_event Aby podjąć wszelkie niezbędne działania, gdy widget zmieni rozmiar.
expose_event Do obsługi przerysowywania zawartości widżetu, gdy obszar rysunku pojawia się po raz pierwszy na ekranie lub gdy jest zakryty przez inne okno, a następnie odsłonięty (odsłonięty).

Zdarzenia myszy i klawiatury mogą również służyć do wywoływania wywołań zwrotnych przez add_events() method z gtk.Widget class.

Szczególnie interesujący jest sygnał zdarzenia ekspozycji, który jest emitowany, gdy po raz pierwszy pojawia się płótno DrawingArea. Różne metody rysowania obiektów 2D, które są zdefiniowane w bibliotece Cairo, są wywoływane z tego wywołania zwrotnego połączonego z sygnałem expose-event. Te metody rysują odpowiednie obiekty w kontekście urządzenia Cairo.

Poniżej przedstawiono dostępne metody rysowania -

  • dc.rectangle (x, y, w, h) - rysuje prostokąt o określonej współrzędnej w lewym górnym rogu i ma podaną szerokość i wysokość.

  • dc.arc (x, y, r, a1, a2) - rysuje łuk kołowy o zadanym promieniu i dwóch kątach.

  • dc.line (x1, y1, x2, y2) - rysuje linię między dwiema parami współrzędnych.

  • dc.line_to (x, y) - rysuje linię od bieżącej pozycji do (x, y)

  • dc.show_text (str) - rysuje łańcuch w bieżącej pozycji kursora

  • dc.stroke () - rysuje kontur

  • dc.fill () - wypełnia kształt aktualnym kolorem

  • dc.set_color_rgb (r, g, b) - ustawia kolor na kontur i wypełnienie wartościami r, gib od 0,0 do 1,0

Przykład

Poniższy skrypt rysuje różne kształty i testuje przy użyciu metod kairskich.

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()

Powyższy skrypt wygeneruje następujące dane wyjściowe -