Существует набор методов, которые используется для рисования в область ‘canvas’. Эти методы могут использоваться любым подклассом gtk.gdk.Drawable (gtk.gdk.Window или gtk.gdk.Pixmap). Вот они:
drawable.draw_point(gc, x, y) |
gc – это Graphics Context, используемый для рисования.
x и y – координаты точки.
drawable.draw_line(gc, x1, y1, x2, y2) |
gc – это Graphics Context.
x1 и y1 – координаты начальной точки. x2 и y2 – координаты конечной точки.
drawable.draw_rectangle(gc, filled, x, y, width, height) |
где gc – это Graphics Context.
filled – это логическое значение, показывающее что фигура должна быть залита цветом кисти – если TRUE, или не залита – если FALSE.
x и y – верхний левый угол прямоугольника.
width и height – ширина и высота прямоугольника.
drawable.draw_arc(gc, filled, x, y, width, height, angle1, angle2) |
gc – это Graphics Context.
filled это логическое значение, показывающее что фигура должна быть залита цветом кисти – если TRUE, или не залита – если FALSE.
x и y – это верхний левый угол прямоугольника, в который вписана кривая. width и height – это ширина и высота этого прямоугольника.
angle1 – это начальный угол, относительно угла на 3 часа, в 1/64 от градуса, против часовой стрелки.
angle2 – это конечный угол, относительно angle1, в 1/64 от градуса, против часовой стрелки.
drawable.draw_polygon(gc, filled, points) |
gc – это Graphics Context.
filled – это логическое значение, показывающее что фигура должна быть залита цветом кисти – если TRUE, или не залита – если FALSE.
points – это список кортежей с координатами [ (0,0), (2,5), (3,7), (4,11) ] точек по которым рисуется многоугольник.
drawable.draw_string(font, gc, x, y, string) drawable.draw_text(font, gc, x, y, string) |
font – это gtk.gdk.Font исполльзуемый для отображения строки.
gc – это Graphics Context.
x и y – координаты начальной точки строки т.е. слева на линии шрифта.
string – это строка из символов для отображения.
Примечание
Оба метода draw_string() и draw_text() объявлены устаревшими – используйте pango.Layout с методом draw_layout().
drawable.draw_layout(gc, x, y, layout) |
gc – это Graphics Context.
x и y – координаты начальной точки.
layout – это pango.Layout для отрисовки.
drawable.draw_drawable(gc, src, xsrc, ysrc, xdest, ydest, width, height) |
gc – это Graphics Context.
src – исходная область для рисования.
xsrc и ysrc – координаты левого верхнего угла прямоугольника в источнике.
xdest и ydest – координаты левого верхнего угла в области для рисования.
width и height – это ширина и высота прямоугольника в источнике который будет копироваться в drawable. Если width или height равен -1, то будет использована вся ширина или высота drawable.
drawable.draw_image(gc, image, xsrc, ysrc, xdest, ydest, width, height) |
gc – это Graphics Context.
image – это исходное изображение.
xsrc и ysrc – координаты левого верхнего угла прямоугольника в источнике.
xdest и ydest – координаты левого верхнего угла в области для рисования.
width и height – это ширина и высота прямоугольника в источнике, который будет копироваться в drawable. Если width или height равен -1, то будет использована вся ширина или высота drawable.
drawable.draw_points(gc, points) |
gc – это Graphics Context.
points – это список кортежей с координатами [ (0,0), (2,5), (3,7), (4,11) ] изображаемых точек.
drawable.draw_segments(gc, segs) |
gc – это Graphics Context.
segs – это список кортежей с координатами начала и конца [ (0,0, 1,5), (2,5, 1,7), (3,7, 1,11), (4,11, 1,13) ] отображаемых отрезков.
drawable.draw_lines(gc, points) |
gc – это Graphics Context.
points – это список кортежей с координатами [ (0,0), (2,5), (3,7), (4,11) ] точек, которые соединяются в линии.
drawable.draw_rgb_image(gc, x, y, width, height, dith, rgb_buf, rowstride) drawable.draw_rgb_32_image(gc, x, y, width, height, dith, buf, rowstride) drawable.draw_gray_image(gc, x, y, width, height, dith, buf, rowstride) |
gc – это Graphics Context.
x и y – это верхний левый угол прямоугольника, в который вписано изображение.
width и height – это ширина и высота этого прямоугольника.
dith – дизеринг, объясняется ниже.
Для метода draw_rgb_image(), rgb_buf – это RGB изображение в виде последовательности троек 8-битных значений. Для метода draw_rgb_32_image() это RGB изображение в виде последовательности троек 8-битных значений с 8 битными отступами (4 значения на пиксел). Для метода draw_gray_image(), buf – это чёрно-белое изображение в виде 8-битных значений.
rowstride – это количество значений с начала строки до следующей строки. Обычно используется: 3 * width для draw_rgb_image(); 4 * width для draw_rgb_32_image(); и, width для draw_gray_image(). Если rowstride равен 0, то строка повторится height раз.
Режимы dither:
RGB_DITHER_NONE # Не использовать дизеринг. RGB_DITHER_NORMAL # Использовать дизеринг только при 8 бит на пиксель (и ниже). RGB_DITHER_MAX # Использовать дизеринг при 16 бит на пиксель и ниже. |
Пример drawingarea.py использует большинство методов DrawingArea. Он также помещает DrawingArea внутрь ScrolledWindow, и добавляет горизонтальный и вертикальный Ruler.
Рисунок 12.1, “Пример области для рисования” показывает окно программы:
Исходный код drawingarea.py находится ниже, также он использует gtk.xpm:
#!/usr/bin/env python # -*- coding: utf8 -*- # example drawingarea.py import pygtk pygtk.require('2.0') import gtk import operator import time import string class DrawingAreaExample: def __init__(self): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_title("Пример Drawing Area") window.connect("destroy", lambda w: gtk.main_quit()) self.area = gtk.DrawingArea() self.area.set_size_request(400, 300) self.pangolayout = self.area.create_pango_layout("") self.sw = gtk.ScrolledWindow() self.sw.add_with_viewport(self.area) self.table = gtk.Table(2,2) self.hruler = gtk.HRuler() self.vruler = gtk.VRuler() self.hruler.set_range(0, 400, 0, 400) self.vruler.set_range(0, 300, 0, 300) self.table.attach(self.hruler, 1, 2, 0, 1, yoptions=0) self.table.attach(self.vruler, 0, 1, 1, 2, xoptions=0) self.table.attach(self.sw, 1, 2, 1, 2) window.add(self.table) self.area.set_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK ) self.area.connect("expose-event", self.area_expose_cb) def motion_notify(ruler, event): return ruler.emit("motion_notify_event", event) self.area.connect_object("motion_notify_event", motion_notify, self.hruler) self.area.connect_object("motion_notify_event", motion_notify, self.vruler) self.hadj = self.sw.get_hadjustment() self.vadj = self.sw.get_vadjustment() def val_cb(adj, ruler, horiz): if horiz: span = self.sw.get_allocation()[3] else: span = self.sw.get_allocation()[2] l,u,p,m = ruler.get_range() v = adj.value ruler.set_range(v, v+span, p, m) while gtk.events_pending(): gtk.main_iteration() self.hadj.connect('value-changed', val_cb, self.hruler, True) self.vadj.connect('value-changed', val_cb, self.vruler, False) def size_allocate_cb(wid, allocation): x, y, w, h = allocation l,u,p,m = self.hruler.get_range() m = max(m, w) self.hruler.set_range(l, l+w, p, m) l,u,p,m = self.vruler.get_range() m = max(m, h) self.vruler.set_range(l, l+h, p, m) self.sw.connect('size-allocate', size_allocate_cb) self.area.show() self.hruler.show() self.vruler.show() self.sw.show() self.table.show() window.show() def area_expose_cb(self, area, event): self.style = self.area.get_style() self.gc = self.style.fg_gc[gtk.STATE_NORMAL] self.draw_point(10,10) self.draw_points(110, 10) self.draw_line(210, 10) self.draw_lines(310, 10) self.draw_segments(10, 100) self.draw_rectangles(110, 100) self.draw_arcs(210, 100) self.draw_pixmap(310, 100) self.draw_polygon(10, 200) self.draw_rgb_image(110, 200) return True def draw_point(self, x, y): self.area.window.draw_point(self.gc, x+30, y+30) self.pangolayout.set_text("Point") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_points(self, x, y): points = [(x+10,y+10), (x+10,y), (x+40,y+30), (x+30,y+10), (x+50,y+10)] self.area.window.draw_points(self.gc, points) self.pangolayout.set_text("Points") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_line(self, x, y): self.area.window.draw_line(self.gc, x+10, y+10, x+20, y+30) self.pangolayout.set_text("Line") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_lines(self, x, y): points = [(x+10,y+10), (x+10,y), (x+40,y+30), (x+30,y+10), (x+50,y+10)] self.area.window.draw_lines(self.gc, points) self.pangolayout.set_text("Lines") self.area.window.draw_layout(self.gc, x+5, y+50, self.pangolayout) return def draw_segments(self, x, y): segments = ((x+20,y+10, x+20,y+70), (x+60,y+10, x+60,y+70), (x+10,y+30 , x+70,y+30), (x+10, y+50 , x+70, y+50)) self.area.window.draw_segments(self.gc, segments) self.pangolayout.set_text("Segments") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_rectangles(self, x, y): self.area.window.draw_rectangle(self.gc, False, x, y, 80, 70) self.area.window.draw_rectangle(self.gc, True, x+10, y+10, 20, 20) self.area.window.draw_rectangle(self.gc, True, x+50, y+10, 20, 20) self.area.window.draw_rectangle(self.gc, True, x+20, y+50, 40, 10) self.pangolayout.set_text("Rectangles") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_arcs(self, x, y): self.area.window.draw_arc(self.gc, False, x+10, y, 70, 70, 0, 360*64) self.area.window.draw_arc(self.gc, True, x+30, y+20, 10, 10, 0, 360*64) self.area.window.draw_arc(self.gc, True, x+50, y+20, 10, 10, 0, 360*64) self.area.window.draw_arc(self.gc, True, x+30, y+10, 30, 50, 210*64, 120*64) self.pangolayout.set_text("Arcs") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_pixmap(self, x, y): pixmap, mask = gtk.gdk.pixmap_create_from_xpm( self.area.window, self.style.bg[gtk.STATE_NORMAL], "gtk.xpm") self.area.window.draw_drawable(self.gc, pixmap, 0, 0, x+15, y+25, -1, -1) self.pangolayout.set_text("Pixmap") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_polygon(self, x, y): points = [(x+10,y+60), (x+10,y+20), (x+40,y+70), (x+30,y+30), (x+50,y+40)] self.area.window.draw_polygon(self.gc, True, points) self.pangolayout.set_text("Polygon") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def draw_rgb_image(self, x, y): b = 80*3*80*['�'] for i in range(80): for j in range(80): b[3*80*i+3*j] = chr(255-3*i) b[3*80*i+3*j+1] = chr(255-3*abs(i-j)) b[3*80*i+3*j+2] = chr(255-3*j) buff = string.join(b, '') self.area.window.draw_rgb_image(self.gc, x, y, 80, 80, gtk.gdk.RGB_DITHER_NONE, buff, 80*3) self.pangolayout.set_text("RGB Image") self.area.window.draw_layout(self.gc, x+5, y+80, self.pangolayout) return def main(): gtk.main() return 0 if __name__ == "__main__": DrawingAreaExample() main()
Предыдущая страница | На уровень выше | Следующая страница |
Глава 12. ООбласть рисования (gtk.DrawingArea) | Оглавление | Глава 13. Виджет TextView |