Область рисования (gtk.DrawingArea)

Виджет DrawingArea это обёртка для gtk.gdk.Window, который является подклассом gtk.gdk.Drawable. В результате DrawingArea предлагает простую область ‘canvas’, в которой можно рисовать, используя методы класса gtk.gdk.Drawable.

DrawingArea создаётся конструктором:

  drawing_area = gtk.DrawingArea()

DrawingArea изначально создаётся с размером (0, 0) поэтому вам нужно использовать следующий метод для настройки ширины и высоты, большей чем 0.

  drawing_area.set_size_request(width, height)

Для рисования в DrawingArea нужно получить обёрнутый gtk.gdk.Window, используя поле window виджета DrawingArea, так, как показано ниже:

  drawable = drawing_area.window

Далее вы можете рисовать на drawable, используя методы gtk.gdk.Drawable, объясняемые в Разделе 12.2, “Методы рисования”.

Примечание

DrawingArea должна быть реализована (т.е. должны быть вызваны методы realize() или show()) для связи с gtk.gdk.Window, которая используется для рисования.

12.1. Контекст графики (Graphics Context)

В gtk.gdk.Window доступно множество разных методов для рисования. Все эти методы требуют graphics context (gtk.gdk.GC), как информацию, необходимую для рисования. Поля gtk.gdk.GC:

background
cap_style
clip_mask
clip_x_origin
clip_y_origin
fill
font
foreground
function
graphics_exposures
join_style
line_style
line_width
stipple
sub_window
tile
ts_x_origin
ts_y_origin

background указывает на gtk.gdk.Color, используемый для цвета фона.

foreground указывает на gtk.gdk.Color, используемый для цвета рисования.

gtk.gdk.Color представляет собой цвет, который может быть определённый или неопределённый. Определённый создаётся с помощью конструктора:

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

где red, green и blue целые числа в диапазоне от 0 до 65535. pixel обычно не указывается, поскольку он перезаписывается при определении цвета.

А неопределённый gtk.gdk.Color можно создать с помощью функции:

  color = gtk.gdk.color_parse(spec)

где spec строка определяющая цвет, содержащая:

  • наименование цвета (например “red”, “orange”, “navajo white” как указано в файле X Window rgb.txt), или
  • Шестнадцатиричное значение, начинающееся с ‘#’ и содержащее 3 набора шестнадцатиричных цифр одинаковой длинны (1, 2, 3 или 4 цифры). Например, “#F0A”, “#FF00AA”, “#FFF000AAA” и “#FFFF0000AAAA” представляют один и тот-же цвет.

gtk.gdk.Color представляет определённый цвет gtk.gdk.Colormap в виде метода alloc_color(), имеющего 3 вариации:

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

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

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

color это неопределённый gtk.gdk.Color. spec, т.е. строка, определяющая цвет для функции gtk.gdk.color_parse() объяснённая выше, red, green и blue это целочисленные значения 0-65535. Также вы можете указать будет ли цвет writeable (т.е. сможет быть изменён позже, но не сможет быть разделён с другим приложением) или best_match (т.е. если точный цвет не доступен, то GTK выдаст наиболее похожий цвет из возможных).

Например:

  navajowhite = colormap.alloc('navajo white')

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

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

Colormap, т.е. цветовую карту, связанную с виджетом можно получить методом:

  colormap = widget.get_colormap()

cap_style определяет стиль окончания линии, к которой не присоединена другая линия. Возможные стили:

CAP_NOT_LAST Рисует конец линии, также как CAP_BUTT для линий с ненулевой толщиной. Для линий с нулевой толщиной последняя точка не рисуется.
CAP_BUTT Линия заканчивается в конечной точке без округления.
CAP_ROUND Окончание линий отображается полукругами с диаметром равным толщине линии, с центрами в конечной точке.
CAP_PROJECTING Окончание линии не округляется и выступает на половину толщины за конечную точку.

clip_mask определяет gtk.gdk.Pixmap, используемый для обрезания рисунка в drawing_area.

clip_x_origin и clip_y_origin определяют обрезающие значения х и y, относительно левого верхнего угла drawing_area.

fill определяют  стиль заливки.  Доступные стили:

SOLID Залить цветом кисти.
TILED Замостить, используя pixmap.
STIPPLED Рисовать используя маску. Пиксели совпадающие с  битами маски  рисуются цветом кисти, остальные не изменяются.
OPAQUE_STIPPLED Рисовать используя маску. Пиксели совпадающие с битами маски рисуются цветом кисти, остальные закрашиваются цветом фона.

font это gtk.gdk.Font, используемый для отображения текста.

Примечание

Поле font объявлено устаревшим.

function определяет то, как исходные пиксели будут смешаны с рисуемыми. Шестнадцать значений отвечают на 16 возможных таблиц истинности 2х2, но только некоторые из них действительно полезны. Для цветных изображений, обычно используются только COPY, XOR и INVERT, для монохромных также возможны AND и OR. Значения function:

  COPY
  INVERT
  XOR
  CLEAR
  AND
  AND_REVERSE
  AND_INVERT
  NOOP
  OR
  EQUIV
  OR_REVERSE
  COPY_INVERT
  OR_INVERT
  NAND
  SET

graphics_exposures содержит логическое значение. Когда содержится TRUE, ошибка в копировании пикселей в операции рисования вызывает событие expose. При успешном копировании вызывается событие noexpose.

join_style определяет стиль соединений, используемый когда линии встречаются под углом. Доступные стили:

JOIN_MITER Линии продолжаются пока не встретятся под углом.
JOIN_ROUND Линии соединяются округлой кривой.
JOIN_BEVEL Линии соединяются третьей линией находящейся под одинаковым углом к каждой из сторон.

line_style определяет стиль, которым отрисовываются линии. Может принимать значения:

LINE_SOLID Линии рисуются как непрерывные отрезки.
LINE_ON_OFF_DASH Чётные отрезки рисуются. Нечётные нет.
LINE_DOUBLE_DASH Чётные отрезки рисуются как обычно. Нечётные рисуются с цветом фона если стиль заливки SOLID, или цветом фона при соответствии с маской, если стиль заливки STIPPLED.

line_width определяет толщину линий.

stipple определяет gtk.gdk.Pixmap, используемый когда fill установлен в STIPPLED или OPAQUE_STIPPLED.

sub_window определяет режим рисования когда gtk.gdk.Window вложено в gtk.gdk.Window. Возможные значения для sub_window:

CLIP_BY_CHILDREN Рисовать только на используемом окне, но не на вложенных.
INCLUDE_INFERIORS Рисовать на окне и вложенных окнах.

tile определяет gtk.gdk.Pixmap используемый когда fill установлен в TILED.

ts_x_origin и ts_y_origin определяют начальное положение для stippling bitmap или tiling pixmap.

Новый Graphics Context создаётся с помощью вызова метода gtk.gdk.Drawable.new_gc():

gc = 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)

В созданном Graphics Context может рисуемой областью может быть:

  • gtk.gdk.Window которое было реализовано, или;
  • gtk.gdk.Pixmap связанный с реализованным gtk.gdk.Window.

Различные поля Graphics Context имют свои значения по умолчанию если они не выбраны в методе new_gc(). Если вы хотите выбрать поля GC, используйте метод new_gc(), он наиболее прост.

Также отдельные параметры для gtk.gdk.GC, могут быть изменены изменением поля объекта GC. Например:

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

Или использованием следующих методов:

  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)

Шаблон, используемый когда line_style установлен в LINE_ON_OFF_DASH или LINE_DOUBLE_DASH может быть изменён следующим методом:

  gc.set_dashes(offset, dash_list)

где offset это сдвиг стартового значения в dash_list. dash_list, который является списком кортежей, содержащих количество пикселей для рисования и для пропуска. Например, если dash_list равен (2, 4, 8, 16) и offset равен 1, то пунктир будет нарисован так: Нарисовать 4 пикселя, пропустить 8 пикселей, нарисовать 16 пикселей, пропустить 2 пикселя, снова нарисовать 4 пикселя и.т.д.

Существующий GC можно скопировать с помощью метода:

  gc.copy(src_gc)

Все поля gc будут такими-же как и у src_gc.


Предыдущая страница На уровень выше  Следующая страница
11.4. Пример использования фабрики Оглавление  12.2. Методы рисования

Оставить комментарий

Ваш email не будет опубликован. Обязательные поля отмечены *

Вы можете использовать это HTMLтеги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>