PyCairo поддерживает различные бэкэнды. Что такое бэкэнд? Это пространство, в котором графика, созданная в PyCairo, будет отображаться. В данном разделе мы воспользуемся PyCairo для создания PNG изображения, PDF и SVG файлов и будем рисовать в окне GTK.
Создать PNG изображение в PyCairo
В первом примере мы создадим PNG изображение.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/usr/bin/python import cairo def main(): ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60) cr = cairo.Context(ims) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") ims.write_to_png("image.png") if __name__ == "__main__": main() |
Данный пример это небольшое консольное приложение, которое создает PNG изображение.
1 |
import cairo |
Здесь мы импортируем модуль PyCairo
1 2 |
ims = cairo.ImageSurface(cairo.FORMAT_ARGB32, 390, 60) cr = cairo.Context(ims) |
Мы создаем поверхность и контекст Cairo от поверхности. Поверхность представлена в виде изображение 390х60 точек.
1 |
cr.set_source_rgb(0, 0, 0) |
Для нашего текста мы применяем черные чернила. Чернила указываются при помощи метода the set_source_rgb() .
1 2 |
cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) |
Выбираем тип шрифта при помощи метода select_font_face() и выбираем размер шрифта при помощи метода set_font_size().
1 2 |
cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") |
Выбираем позицию x=10.0, y=50.0 в изображении и вносим текст.
1 |
ims.write_to_png("image.png") |
Метод write_to_png() записывает содержимое поверхности в изображение PNG.
Создание PDF файла в PyCairo
Во втором примере, мы создадим простой PDF файл.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/python import cairo def main(): ps = cairo.PDFSurface("pdffile.pdf", 504, 648) cr = cairo.Context(ps) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") cr.show_page() if __name__ == "__main__": main() |
Нам нужно открыть данный файл в приложении для чтения PDF файлов. Пользователи Linux могут воспользоваться программами KPDF или Evince.
1 |
ps = cairo.PDFSurface("pdffile.pdf", 504, 648) |
Для рендеринга файла PDF нам нужно создать поверхность PDF, используя объект cairo.PDFSurface размер PDF файла определяется стандартными для верстки точками.
1 |
cr.show_page() |
Команда show_page() заканчивает рендеринг PDF файла.
Создать SVG файл в PyCairo
В данном примере мы создадим простой SVG (Scalable Vector Graphics – буквальный перевод — масштабируемая векторная графика) файл. Файлы SVG базируются на файловом формате XML.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#!/usr/bin/python import cairo def main(): ps = cairo.SVGSurface("svgfile.svg", 390, 60) cr = cairo.Context(ps) cr.set_source_rgb(0, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") cr.show_page() if __name__ == "__main__": main() |
Мы можем воспользоваться браузером Google Chrome или программой, работающей с векторной графикой, такой как Inkscape для того чтобы открыть файл SVG
1 |
ps = cairo.SVGSurface("svgfile.svg", 390, 60) |
Для создания SVG файла в PyCairo, мы должны создать поверхность SVG, применив объект cairo.SVGSurface .
1 |
cr.show_page() |
Метод show_page() заканчивает рендеринг SVG файла.
SVG файл в браузере Chrome
Создание GTK окна в PyCairo
В последнем примере мы воспользуемся окном GTK. Данный бэкэнд мы будем использовать в дальнейшем.
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 |
#!/usr/bin/python from gi.repository import Gtk import cairo 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("GTK window") self.resize(420, 120) 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, 0, 0) cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_NORMAL) cr.set_font_size(40) cr.move_to(10, 50) cr.show_text("Disziplin ist Macht.") def main(): app = Example() Gtk.main() if __name__ == "__main__": main() |
Данный пример будет отображаться в центре окно GTK, где мы написали текст «Disziplin ist Macht».
1 2 |
from gi.repository import Gtk import cairo |
Импортируем необходимые модули PyCairo и GTK.
1 |
darea = Gtk.DrawingArea() |
Далее мы рисуем на виджете Gtk.DrawingArea
1 |
darea.connect("draw", self.on_draw) |
После того как окно перерисуется , мы связываем сигнал draw с функцией обратного вызова (callback) on_draw().
1 2 |
def on_draw(self, wid, cr): ... |
Рисунок заканчивается внутри метода on_draw() . Третий параметр является контекстом Cairo, который становится доступным автоматически. Библиотека Cairo встроена в систему GTK.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»