Introducció a la creació de scripts en Python

Novetat de la versió 4.0.

Quan vam oferir la creació de scripts en Python com un dels objectius de Kickstarter, ho vam poder implementar conjuntament amb els vectors i el text, va guanyar el vot de suport per una esllavissada. Algunes persones fins i tot només van triar Python i res més. Llavors, què és exactament la creació de scripts en Python?

Què és la creació de scripts en Python?

El Python és un llenguatge per a la creació de scripts, que es pot utilitzar per a automatitzar les tasques. Això vol dir que per a la creació de scripts en Python al Krita hem afegit una API al Krita, la qual és una mica de programació que permet al Python accedir a les parts del Krita. Amb això podem crear acobladors, realitzar tasques de baixa categoria sobre un munt de fitxers diferents i fins i tot escriure els nostres propis exportadors. Les persones que treballen amb gràfics per ordinador, com ara artistes dels efectes especials i dels videojocs, utilitzen molt el Python per a fer un munt de coses com fulls de franges, automatitzar parts de l'exportació i molt més.

Ensenyar-vos Python queda fora de l'abast d'aquest manual. Tanmateix, com el Python és un llenguatge de programació extremadament popular i ideal per a principiants, hi ha un munt de material d'aprenentatge que trobareu ràpidament amb una simple cerca d'Internet com «aprendre Python».

En canvi, aquest manual se centrarà en com utilitzar Python per a automatitzar i ampliar el Krita. Per això, primer començarem amb els conceptes bàsics: Com executar ordres de Python a l'Scripter.

Com habilitar el connector Scripter

El connector Scripter no és necessari per a utilitzar Python, però és molt útil per a provar i jugar amb el Python. És una consola de Python, escrita en Python, la qual es pot utilitzar per a escriure petits scripts i executar-los sobre la marxa.

Per a obrir l'Scripter, aneu a «Eines ‣ Scripts ‣ Scripter». Si no el veieu a la llista, aneu a «Arranjament ‣ Configura el Krita... ‣ Gestor de connectors en Python» i marqueu «Scripter» a la llista per a habilitar-lo. Si no veieu aquest connector, assegureu-vos d'estar emprant una versió actualitzada del Krita.

L'Scripter apareixerà amb una finestra de l'editor de text a la part superior i una finestra de sortida a sota. Introduïu el següent a l'àrea de text:

print("Hola món")

Premeu el gran botó de reproducció o premeu la drecera Ctrl + R per a executar l'script. Després, a l'àrea de sortida de sota hauria d'aparèixer el següent:

==== Warning: Script not saved! ====
Hola món

Ara tenim una consola que pot executar funcions com print() des de l'entorn de Python. Però, com la utilitzem per a gestionar el Krita?

Executar ordres bàsiques del Krita

Per a permetre que el Python es comuniqui amb el Krita, utilitzarem el mòdul Krita. A la part superior de cada script, escriurem from krita import *.

Això permet que es parli amb el Krita a través de la Krita.instance(). Intentem duplicar les nostres habilitats de picar codi amb Python.

from krita import *

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

Hauríeu de veure una segona finestra oberta de l'Scripter. Amb bona pinta! Aquí hi ha un exemple una mica més avançat.

from krita import *

d = Krita.instance().createDocument(512, 512, "Document de prova en Python", "RGBA", "U8", "", 120.0)
Krita.instance().activeWindow().addView(d)

Això obrirà un document nou. Amb claredat, el Python dóna prou control per a automatitzar el Krita. Amb el temps, esperem que la comunitat escrigui tota classe de scripts que es puguin emprar simplement enganxant-los a l'Scripter.

Però, i si voleu escriure ordres noves? El millor lloc per a començar és molt simple: cercar exemples escrits per altres persones! Estalviareu molt temps si algú més ha escrit un codi en el qual podeu basar el vostre treball. També val la pena mirar a través dels connectors en Python, els quals es troben a /share/krita/pykrita. També hi ha una guia pas a pas per a Com crear un connector en Python per al Krita en aquest manual.

Però és probable que necessiteu més informació. Per això, necessitarem veure què hi ha amagat al darrere de l'asterisc quan feu import * from Krita. Per a saber quines funcions del Krita hi ha disponibles i com usar-les, haureu de consultar la documentació de referència de l'API del Krita.

API del Krita

Al començament, pot semblar que aquestes pàgines contenen molt d'argot. Això es deu al fet que la documentació de l'API del Krita prové del llenguatge en C++ subjacent amb el qual està escrit el Krita. La màgia succeeix a causa d'una eina de Python anomenada SIP, la qual possibilita que el Python parli en C++ i que d'aquesta manera parli amb el Krita. El resultat final és que quan fem import krita i cridem a les funcions, en realitat estem utilitzant els mètodes de C ++ enumerats en aquesta documentació.

Vegem com funciona això amb més detall. Vegem el segon enllaç, la referència a les classes del Krita. Allà veurem totes les funcions disponibles per a la instància del Krita. Si escriviu dir(Krita.instance()) en Python, hauria de coincidir molt amb aquesta pàgina. Vegeu la documentació de les funcions createDocument(), activeWindow() i action() que hem emprat anteriorment.

Una de les coses més confuses és veure totes les classes de C++ que utilitza el Krita, incloses les classes de les Qt que comencen amb Q. Però aquí resideix la bellesa de SIP: tracta de fer que la traducció d'aquestes classes a Python sigui la més senzilla i directe possible. Per exemple, veureu que la funció filters() retorna una QStringList. No obstant això, el SIP convertirà aquestes QStringList en una llista de cadenes normals de Python.

from krita import *

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

Sortides com:

['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']

Tanmateix, de vegades la conversió no va tan bé.

from krita import *

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

dóna quelcom com això:

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

Aquesta és una llista de quelcom, és clar. Però com utilitzar-la? Si tornem a la pàgina de documentació de l'API del Krita i mirem la funció, documents() veurem que en realitat hi ha un enllaç a la classe «Document». Si seguiu aquest enllaç, veureu que el document ha cridat a una funció anomenada name(), la qual retorna el nom del document, i les funcions width() i height(), les quals retornen les dimensions. Llavors, si volguéssim generar un informe amb informació sobre els documents en el Krita, podríem escriure un script com aquest:

from krita import *

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

Obtindrem una sortida com:

==== Warning: Script not saved! ====
Sense nom
 2480x3508
esbós21
 3508x2480
Matinada blava
 1600x900

Esperem que això us doni una idea sobre com navegar per la documentació de l'API.

L'API del Krita té moltes més classes, podeu accedir-hi anant a la llista de la part superior esquerra, o simplement fent clic en els seus noms per a accedir a la seva documentació de l'API. Les funcions print() o dir() també són els vostres amics aquí. Aquesta línia imprimirà una llista de totes les accions en el Krita -en l'exemple anterior, podreu canviar una d'aquestes ordres en lloc de «python_scripter»-.

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

El mòdul de Python inspect es va dissenyar per a aquest tipus de tasques. Aquesta és una funció útil per a imprimir informació sobre una classe a la consola.

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

getInfo(Krita.instance())

Finalment, a més de la documentació de la LibKis, la documentació de les Qt, ja que el Krita utilitza el PyQt per a exposar gairebé tota l'API de les Qt al Python. Podeu construir finestres senceres amb botons i formularis d'aquesta manera, emprant les mateixes eines que empra el Krita! Podeu llegir la documentació de les Qt i la documentació de PyQt per a obtenir més informació referent a això, i també podeu estudiar els connectors inclosos per a veure com funcionen.

Detalls tècnics

Creació de scripts en Python a Windows

Perquè la creació de scripts en Python funcioni en el Windows 7/8/8.1, haureu d'instal·lar Universal C Runtime des del lloc web de Microsoft. (Windows 10 ja ve amb ell).

Python 2 i 3

De manera predeterminada, el Krita es compila per a Python 3.

Tanmateix, és possible compilar-lo amb Python 2. Per a fer-ho, haureu d'afegir el següent a la línia de configuració del «cmake»:

-DENABLE_PYTHON_2=ON