Вступ до створення сценаріїв на Python

Нове в версії 4.0.

Коли ми запропонували реалізацію підтримки сценаріїв мовою Python для обробки векторних і текстових даних як одну з цілей для збирання коштів на Kickstarter, кількість спонсорів була величезною. Дехто навіть хотів лише підтримки Python і нічого іншого. Отже, що ж таке сценарії мовою Python?

Що являють собою сценарії мовою Python?

Python — скриптова мова, якою можна скористатися для автоматизації роботи. Можливість користуватися сценаріями Python у Krita означає, що у Krita є програмний інтерфейс, який уможливлює доступ до частин Krita за допомогою коду мовою Python. За допомогою цього інтерфейсу ми можемо створювати бічні панелі, виконувати пакетну обробку багатьох різних файлів і навіть створювати власні засоби експортування даних. Ті, хто працює із комп’ютерною графікою, зокрема VFX та графікою відеоігор, використовують Python для виконання багатьох завдань, зокрема створення спрайтів, автоматизації частину процесів експортування тощо.

У цьому розділі підручника ми не будемо вчити вас самого програмування мовою Python. Втім, оскільки Python є надзвичайно популярною і зручною для початківців мовою програмування, існує безліч навчальних матеріалів, які можна знайти за простим пошуком у інтернеті з ключовими словами «вивчити python».

Натомість у цьому розділі ми зосередимося на тому, як скористатися Python для автоматизації та розширення можливостей Krita. Для цього ми розпочнемо з основ — того, як віддавати команди Python у скриптері.

Як увімкнути додаток для роботи із сценаріями

Для користування python додаток «Скриптер» не є обов’язковим, але він є дуже корисним для тестування та вправляння у python. Це консоль Python, яку написано на Python і якою можна користуватися для створення невеличких сценаріїв і виконання їх на льоту.

Щоб відкрити вікно скриптера, скористайтеся пунктом меню Інструменти ‣ Скрипти ‣ Скриптер. Якщо цього пункту у меню немає, скористайтеся пунктом меню Параметри ‣ Налаштувати Krita… ‣ Керування додатками Python і увімкніть «Скриптер» у списку, щоб у програмі з’явився відповідний пункт меню. Якщо у списку додатків немає «Скриптера», переконайтеся, що ви користуєтеся достатньо новою версією Krita.

Скриптер відкриє вікно текстового редактора згори і вікно виведення даних унизу. Введіть такі команди до області редагування тексту:

print("hello world")

Натисніть білу кнопку відтворення або комбінацію клавіш Ctrl + R, щоб наказати програмі виконати сценарій. Далі, у області виведення даних має з’явитися ось що:

==== Warning: Script not saved! ====
hello world

Гаразд, маємо консоль, у якій можна запускати функції, подібні до print(), у середовищі Python. Але як скористатися нею для керування Krita?

Виконання базових команд Krita

Щоб дозволити Python обмінюватися даними з Krita, ми скористаємося модулем Krita. На початку будь-якого сценарію маємо написати: from krita import *.

Це надасть змогу сценарію обмінюватися даними з Krita за допомогою Krita.instance(). Давайте спробуємо подвоїти наші можливості з програмування за допомогою Python.

from krita import *

Krita.instance().action('python_scripter').trigger()

Ви маєте побачити відкриття другого вікна скриптера. Нічогенько! Ось трохи ширший приклад.

from krita import *

d = Krita.instance().createDocument(512, 512, "Python test document", "RGBA", "U8", "", 120.0)
Krita.instance().activeWindow().addView(d)

Виконання цього сценарію має призвести до відкриття нового документа. Очевидно, Python надає вам доволі широкі можливості з автоматизації роботи Krita. З часом, ми очікуємо, що спільнота користувачів напише сценарії усіх типів, щоб ви могли просто вставити текст цих сценаріїв до вікна скриптера.

Але що робити, якщо ви захочете написати нові команди власноруч? Перший крок є доволі простим: пошукайте приклади у коді, який вже кимось написано! Ви можете заощадити багато часу, якщо знайдете чийсь інший код, на якому ви зможете заснувати свою роботу. Також варто ознайомитися зі додатками Python, файли яких зберігаються у каталозі /share/krita/pykrita. Крім того, у цьому підручнику є покрокові настанови у розділі Як створити додаток до Krita мовою Python.

Втім, ймовірно, вам знадобиться більше інформації. Щоб із нею ознайомитися, вам доведеться вивчити, що ховається за символом зірочки, коли ви віддаєте команду import * from Krita. Щоб дізнатися про те, які функції доступні у Krita і як ними користуватися, вам слід ознайомитися із довідковою інформацією щодо програмного інтерфейсу Krita.

Програмний інтерфейс Krita

Спочатку може здатися, що ці сторінки переповнені жаргоном. Причина полягає у тому, що документація з програмного інтерфейсу Krita є похідною від основної мови програмування C++, якою, власне, написано саму Krita. Магічне поєднання відбувається за допомогою інструмента Python, який має назву SIP і який уможливлює для Python «спілкування» з кодом C++ і самою Krita. Кінцевим результатом є те, що, коли ми віддаємо команду import krita і викликаємо функції, насправді, ми викликаємо методи C++, про які оповідає документація з програмного інтерфейсу.

Розгляньмо детальніше, як усе це працює. Звернімося до другого посилання, довідника з класів Krita. У цьому довіднику ми можемо бачити усі функції, доступні у екземплярі Krita. Якщо ви введете команду dir(Krita.instance()) у Python, вона має вивести щось дуже подібне до цієї сторінки — ви зможете переглянути документацію щодо функцій createDocument(), activeWindow() та action(), якими ми скористалися вище.

Однією із речей, які дещо збивають із пантелику, є те, що ми бачимо усі класи C++, які використовує Krita, зокрема класи Qt, назви яких починаються з Q. Але у цьому і полягає краса SIP: цей інструмент намагається стати містком між цими класами і Python, якомога простішим і зрозумілішим. Наприклад, ви можете бачити, що функція filters() повертає QStringList. Втім, SIP перетворює такі QStringList у звичайні списки рядків Python!

from krita import *

print(Krita.instance().filters())

Виведе

['asc-cdl', 'autocontrast', 'blur', 'burn', 'colorbalance', 'colortoalpha', 'colortransfer',
'desaturate', 'dodge', 'edge detection', 'emboss', 'emboss all directions', 'emboss horizontal and vertical',
'emboss horizontal only', 'emboss laplascian', 'emboss vertical only', 'gaussian blur', 'gaussiannoisereducer',
'gradientmap', 'halftone', 'height to normal', 'hsvadjustment', 'indexcolors', 'invert', 'lens blur', 'levels',
'maximize', 'mean removal', 'minimize', 'motion blur', 'noise', 'normalize', 'oilpaint', 'perchannel', 'phongbumpmap',
'pixelize', 'posterize', 'raindrops', 'randompick', 'roundcorners', 'sharpen', 'smalltiles', 'threshold', 'unsharp',
'wave', 'waveletnoisereducer']

Втім, іноді перетворення відбувається не так, як можна було б сподіватися.

from krita import *

print(Krita.instance().documents())

дасть нам щось таке:

[<PyKrita.krita.Document object at 0x7f7294630b88>,
<PyKrita.krita.Document object at 0x7f72946309d8>,
<PyKrita.krita.Document object at 0x7f7294630c18>]

Це список чогось, але як скористатися ним? Якщо ми повернемося до сторінки документації з програмного інтерфейсу Krita і поглянемо на документацію до documents(), ми побачимо придатне до натискання посилання на клас «Document». Якщо перейти за цим посиланням, можна бачити, що клас документа містить функцію name(), яка повертає назву документа, та функції width() (ширина) та height() (висота), які повертають розмірності документа. Отже, якщо нам потрібно зібрати звіт щодо документів у Krita, можна скористатися таким кодом:

from krita import *

for doc in Krita.instance().documents():
    print(doc.name())
    print(" "+str(doc.width())+"x"+str(doc.height()))

Ми отримуємо виведені результати, які подібні до таких:

==== Warning: Script not saved! ====
Unnamed
 2480x3508
sketch21
 3508x2480
Blue morning
 1600x900

Сподіваємося, ви тепер зрозуміли, як вивчати документацію із програмного інтерфейсу.

У програмному інтерфейсі Krita передбачено багато інших класів. Ознайомитися із їхнім списком можна за допомогою списку класів у верхній лівій частині сторінки або натисканням назв класів для перегляду відповідної документації з програмного інтерфейсу. Корисні при цьому будуть такою функції print() та dir(). Ці команди виводять список усіх дій у Krita — ви можете завантажити одну з цих команд замість «python_scripter» у наведеному вище прикладі.

[print([a.objectName(), a.text()]) for a in Krita.instance().actions()]

Модуль Python inspect було розроблено саме для такого типу завдань. Ось корисна функція для виведення даних щодо класу до консолі:

import inspect
def getInfo(target):
    [print(item) for item in inspect.getmembers(target) if not item[0].startswith('_')]

getInfo(Krita.instance())

Нарешті, на додачу до документації з LibKis, можна скористатися документацією з Qt, оскільки Krita використовує PyQt для надання доступу до майже усього програмного інтерфейсу Qt з середовища Python. За допомогою цього інструментарію ви можете будувати цілі вікна із кнопками та формами, використовуючи ті самі інструменти, які використовує Krita! Щоб дізнатися більше, ознайомтеся із документацією з Qt та документацією з PyQt, також, звичайно, вивчіть додатки, які включено до пакунка з Krita, а також ознайомтеся із принципами їхньої роботи.

Технічні подробиці

Сценарії на Python у Windows

Щоб мати змогу користуватися сценаріями Python у Windows 7/8/8.1, вам слід встановити Універсальне середовище виконання C з сайта Microsoft. (Це середовище вже є частиною Windows 10.)

Python 2 і 3

Типово, Krita зібрано для використання python 3.

Втім, програму можна зібрати і з підтримкою python 2. Для цього вам слід додати таку команду до рядка налаштовування системи збирання cmake:

-DENABLE_PYTHON_2=ON