Виджет 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()
Приведенный выше скрипт сгенерирует следующий вывод: