В этой части учебного материала, мы будем создавать базовые и более сложные фигуры. Эти фигуры мы будем заливать сплошным цветом, а также применять узоры и градиенты. Градиенты будут рассмотрены подробнее в отдельной главе. Изображения, используемые в данном учебном материале можно скачать здесь.
Базовые фигуры
В PyCairo существует несколько базовых методов для создания простых фигур.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
def on_draw(self, wid, cr): cr.set_source_rgb(0.6, 0.6, 0.6) cr.rectangle(20, 20, 120, 80) cr.rectangle(180, 20, 80, 80) cr.fill() cr.arc(330, 60, 40, 0, 2*math.pi) cr.fill() cr.arc(90, 160, 40, math.pi/4, math.pi) cr.fill() cr.translate(220, 180) cr.scale(1, 0.7) cr.arc(0, 0, 50, 0, 2*math.pi) cr.fill() |
В данном примере мы создадим прямоугольник, квадрат, круг дугу и эллипс.
1 2 |
cr.rectangle(20, 20, 120, 80) cr.rectangle(180, 20, 80, 80) |
Метод rectangle() применяется как при создании квадратов, так и прямоугольников. Квадрат представлен в виде специфической формы прямоугольника. Параметры координат заданы как х и у в левом верхнем углу окна и отвечают за ширину и высоту прямоугольника.
1 |
cr.arc(330, 60, 40, 0, 2*math.pi) |
Метод arc() создает круг. Параметры х и у являются координатами центра дуги, радиусом, а также начальными и конечными углами в радианах.
1 |
cr.arc(90, 160, 40, math.pi/4, math.pi) |
Здесь мы проводим дугу, часть окружности.
1 2 |
cr.scale(1, 0.7) cr.arc(0, 0, 50, 0, 2*math.pi) |
Методы scale() и arc() применяются для создания эллипса.
Остальные фигуры могут быть созданы с использованием базовых примитивов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#!/usr/bin/python from gi.repository import Gtk import cairo class cv(object): points = ( ( 0, 85 ), ( 75, 75 ), ( 100, 10 ), ( 125, 75 ), ( 200, 85 ), ( 150, 125 ), ( 160, 190 ), ( 100, 150 ), ( 40, 190 ), ( 50, 125 ), ( 0, 85 ) ) class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Complex shapes") self.resize(460, 240) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def on_draw(self, wid, cr): cr.set_source_rgb(0.6, 0.6, 0.6) cr.set_line_width(1) for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill() cr.move_to(240, 40) cr.line_to(240, 160) cr.line_to(350, 160) cr.fill() cr.move_to(380, 40) cr.line_to(380, 160) cr.line_to(450, 160) cr.curve_to(440, 155, 380, 145, 380, 40) cr.fill() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
В этом примере мы создадим звезду, треугольник и модифицированный треугольник. Эти фигуры созданы при помощи линий и одной кривой.
1 2 3 4 |
for i in range(10): cr.line_to(cv.points[i][0], cv.points[i][1]) cr.fill() |
Чтобы нарисовать звезду мы соединили все точки, находящиеся в точечном кортеже. Метод fill() заполняет звезду сплошным цветом.
1 2 3 4 |
cr.move_to(240, 40) cr.line_to(240, 160) cr.line_to(350, 160) cr.fill() |
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Линии формируют треугольник. Последние две точки соединяются автоматически.
1 2 3 4 5 |
cr.move_to(380, 40) cr.line_to(380, 160) cr.line_to(450, 160) cr.curve_to(440, 155, 380, 145, 380, 40) cr.fill() |
Заливка
Заливка заполняет внутреннее пространство фигуры. Фигуру можно залить сплошным цветом, узором или градиентом.
Цвет
Цвет является сочетание красного, зеленого и синего с разной степенью интенсивности. В PyCairo интенсивность этих цветов варьируется от 0 до 1.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def on_draw(self, wid, cr): cr.set_source_rgb(0.2, 0.23, 0.9) cr.rectangle(10, 15, 90, 60) cr.fill() cr.set_source_rgb(0.9, 0.1, 0.1) cr.rectangle(130, 15, 90, 60) cr.fill() cr.set_source_rgb(0.4, 0.9, 0.4) cr.rectangle(250, 15, 90, 60) cr.fill() |
В данном примере мы нарисовали четыре закрашенных прямоугольника.
1 2 3 |
cr.set_source_rgb(0.2, 0.23, 0.9) cr.rectangle(10, 15, 90, 60) cr.fill() |
Метод set_source_rgb() задает исходник (source) в непрозрачном цвете. Параметрами является интенсивность красного, зеленого и синего. Исходник заполняет пространство прямоугольника с применением метода fill().
Узоры
Узором называют комплекс графических объектов, которые можно использовать для заливки фигур.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#!/usr/bin/python from gi.repository import Gtk import cairo class Example(Gtk.Window): def __init__(self): super(Example, self).__init__() self.init_ui() self.create_surpat() def init_ui(self): darea = Gtk.DrawingArea() darea.connect("draw", self.on_draw) self.add(darea) self.set_title("Patterns") self.resize(300, 290) self.set_position(Gtk.WindowPosition.CENTER) self.connect("delete-event", Gtk.main_quit) self.show_all() def create_surpat(self): sr1 = cairo.ImageSurface.create_from_png("blueweb.png") sr2 = cairo.ImageSurface.create_from_png("maple.png") sr3 = cairo.ImageSurface.create_from_png("crack.png") sr4 = cairo.ImageSurface.create_from_png("chocolate.png") self.pt1 = cairo.SurfacePattern(sr1) self.pt1.set_extend(cairo.EXTEND_REPEAT) self.pt2 = cairo.SurfacePattern(sr2) self.pt2.set_extend(cairo.EXTEND_REPEAT) self.pt3 = cairo.SurfacePattern(sr3) self.pt3.set_extend(cairo.EXTEND_REPEAT) self.pt4 = cairo.SurfacePattern(sr4) self.pt4.set_extend(cairo.EXTEND_REPEAT) def on_draw(self, wid, cr): cr.set_source(self.pt1) cr.rectangle(20, 20, 100, 100) cr.fill() cr.set_source(self.pt2) cr.rectangle(150, 20, 100, 100) cr.fill() cr.set_source(self.pt3) cr.rectangle(20, 140, 100, 100) cr.fill() cr.set_source(self.pt4) cr.rectangle(150, 140, 100, 100) cr.fill() def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
В данном примере мы нарисовали четыре прямоугольника. На этот раз мы заполнили их разными узорами. Мы использовали четыре изображения при помощи программы для манипуляции над изображениями Gimp. Мы должны сохранить исходный размер этих узоров, так как мы собираемся заполнить ими пространство фигуры.
Мы создали поверхности изображения вне метода draw() . Так как было бы проблематично считывать с жёсткого диска каждый раз, когда окно нужно перерисовать.
1 |
sr1 = cairo.ImageSurface.create_from_png("blueweb.png") |
Поверхностное изображение в нашем случае создано из PNG картинки.
1 2 |
self.pt1 = cairo.SurfacePattern(sr1) self.pt1.set_extend(cairo.EXTEND_REPEAT) |
Узор создан на основе поверхности. Мы применяем режим, cairo.EXTEND_REPEAT который позволяет узору заполнить пространство «плиткой».
1 2 3 |
cr.set_source(self.pt1) cr.rectangle(20, 20, 100, 100) cr.fill() |
Здесь мы рисуем наш первый прямоугольник. Метод set_source() указывает контексту Cairo на то, что данный узор используется как средство для заливки. Узор может не соответствовать в точности форме фигуры. Метод rectangle() указывает на то, что мы работаем именно с прямоугольной фигурой. И, наконец, метод fill() заполняет фигуру используемым исходником.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»