Учебники

PyGTK — класс DrawingArea

Виджет DrawingArea представляет пустой холст, содержащий окно gtk.gdk.Window, на котором можно рисовать такие объекты, как линия, прямоугольник, дуга и т. Д.

PyGTK использует библиотеку Cairo для таких операций рисования. Каир — это популярная библиотека векторной графики 2D. Он написан на C., хотя он имеет привязки на большинстве языков, таких как C ++, Java, Python, PHP и т. Д. Библиотека Cairo может использоваться для рисования на стандартных устройствах вывода в различных операционных системах. Он также может быть использован для создания файлов PDF, SVG и пост-скриптов.

Чтобы выполнить различные операции рисования, мы должны извлечь устройство из текста целевого выходного объекта. В этом случае, поскольку рисунок появляется в виджете gtk.DrawingArea, получается контекст устройства gdk.Window, содержащегося в нем. Этот класс имеет метод cairo-create (), который возвращает контекст устройства.

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

Виджет DrawingArea может быть подключен к обратным вызовам на основе следующих сигналов, излучаемых им:

Понимать Выполнять любые необходимые действия, когда виджет создается на определенном дисплее.
configure_event Выполнять любые необходимые действия, когда виджет меняет размер.
expose_event Для обработки перерисовки содержимого виджета, когда область рисования сначала появляется на экране, или когда она закрывается другим окном, а затем открывается (открывается).

События Mouse и Keyboard могут также использоваться для вызова обратных вызовов методом add_events () класса gtk.Widget .

Особый интерес представляет сигнал события expose, который излучается при первом появлении холста DrawingArea. Различные методы рисования 2D-объектов, определенные в библиотеке Cairo, вызываются из этого обратного вызова, связанного с сигналом expose-event. Эти методы рисуют соответствующие объекты в контексте устройства Cairo.

Ниже приведены доступные методы рисования —

  • dc.rectangle (x, y, w, h) — рисует прямоугольник с указанной верхней левой координатой и имеет ширину и высоту.

  • dc.arc (x, y, r, a1, a2) — рисует круговую дугу с заданным радиусом и двумя углами.

  • dc.line (x1, y1, x2, y2) — рисует линию между двумя парами координат.

  • dc.line_to (x, y) — рисует линию от текущей позиции до (x, y)

  • dc.show_text (str) — рисует строку в текущей позиции курсора

  • dc.stroke () — рисует контур

  • dc.fill () — заполняет фигуру текущим цветом

  • dc.set_color_rgb (r, g, b) — устанавливает цвет для контура и заполняет значениями r, g и b от 0,0 до 1,0

dc.rectangle (x, y, w, h) — рисует прямоугольник с указанной верхней левой координатой и имеет ширину и высоту.

dc.arc (x, y, r, a1, a2) — рисует круговую дугу с заданным радиусом и двумя углами.

dc.line (x1, y1, x2, y2) — рисует линию между двумя парами координат.

dc.line_to (x, y) — рисует линию от текущей позиции до (x, y)

dc.show_text (str) — рисует строку в текущей позиции курсора

dc.stroke () — рисует контур

dc.fill () — заполняет фигуру текущим цветом

dc.set_color_rgb (r, g, b) — устанавливает цвет для контура и заполняет значениями r, g и b от 0,0 до 1,0

пример

Следующий скрипт рисует различные фигуры и тестирует их с помощью методов Каира.

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

Приведенный выше скрипт сгенерирует следующий вывод: