Методы рисования

Существует набор методов, которые используется для рисования в область ‘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, “Пример области для рисования” показывает окно программы:

Рисунок 12.1. Пример области для рисования

Drawing Area Example

Исходный код 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

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

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

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