Виджет 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, которая используется для рисования.
В 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. Методы рисования |