Introductie tot scripts maken in Python

Nieuw in versie 4.0.

Toen we python scripting als een van de Kickstarter Stretchgoals aanboden, konden we daarna vectors en tekst implementeren, het won de backer stemming met een groot verschil. Sommige mensen kozen zelfs alleen python en niets anders. Wat is dan python scripting precies?

Wat is scripts maken in Python?

Python is een scripttaal die u kunt gebruiken om werkzaamheden te automatiseren. Python scripting in Krita houdt in dat we een API aan krita hebben toegevoegd, wat een stukje programmering is zodat python toegang heeft tot gedeelten van Krita. Hiermee kunnen we dockers (panelen) maken, repeterende taken uitvoeren op veel verschillende bestanden en zelfs onze eigen exports schrijven. Mensen die met computer graphics werken, zoals VFX en video game artiesten gebruiken vaak python om zaken te maken zoals sprite sheets, gedeelten van een export te automatiseren en nog veel meer.

Het is buiten de scope van deze handleiding om u python zelf te leren. Echter omdat python een uiterst populaire programmeertaal is en zeer geschikt voor beginners, is er veel instructie-materiaal die u makkelijk met een eenvoudige zoekopdracht voor ‘learn python’ op het internet kan vinden.

Deze handleiding zal in plaats daarvan zich concentreren op hoe u python kunt gebruiken om Krita te automatiseren en uit te breiden. Daarvoor beginnen we eerst met de basis: Hoe we Python commando’s in de Scriptmaker kunnen uitvoeren.

Hoe de Scriptmaker Plugin in te schakelen

De Scriptmaker plugin is niet noodzakelijk om python te gebruiken, maar het is zeer handig bij het testen en om met python te spelen. Het is een python console, geschreven in python, wat gebruikt kan worden om kleine scripts te schrijven en om ze daarna onmiddellijk uit kunnen testen.

Om de Scriptmaker te openen, gaat u naar Hulpmiddelen ‣ Scripts ‣ Scriptmaker. Als u het niet in de lijst ziet, ga dan naar Instellingen ‣ Krita instellen… ‣ Plugin-beheer van Python en schakel daar in de lijst “Scriptmaker” in. Als u de Scriptmaker plugin niet ziet, controleer dan of u wel een up-to-date versie van Krita heeft.

De Scriptmaker zal openen met een teksteditor bovenaan en een uitvoervenster onderaan. Voer het volgende in het teksteditor:

print("hello world")

Druk op de grote knop voor uitvoeren of druk op de sneltoets Ctrl + R om het script uit te voeren. U zou dan onderaan in het uitvoervenster het volgende te zien moeten krijgen:

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

OK, we hebben nu een terminalvenster dat vanuit de Python environment functies zoals print() kan uitvoeren - maar hoe gebruiken we het om Krita te beheren?

eenvoudige Krita commando’s uitvoeren

Om Python met Krita te kunnen laten communiceren, moeten we de Krita module gebruiken. Aan het begin van elk script voegen we toe from krita import *.

Hierdoor kunnen we met Krita praten via een Krita.instance(). Laten we onze programmeer kennis van python uitbreiden.

from krita import *

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

U zou moeten zien dat een tweede venster van scriptmaker opent. Heel mooi! Hier is een beetje geavanceerder exemplaar.

from krita import *

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

Dit zal een nieuw document openen. Python geeft u duidelijk veel mogelijkheden om Krita te automatiseren. We verwachten dat de gemeenschap in de loop der tijd allerlei soorten scripts zal gaan schrijven die u gewoon kan gebruiken door het in de scriptmaker te plakken.

Maar wat als uzelf nieuwe commando’s wilt schrijven? De beste plek om te starten is heel simpel: zoek naar voorbeelden die door andere mensen zijn geschreven! U kunt veel tijd besparen als iemand anders code heeft geschreven waarop u uw werk kan baseren. Het kan ook zinvol zijn om de python plugins te bestuderen, die te vinden zijn in /share/krita/pykrita. Er is ook een voor stap handleiding voor Hoe een Python plug-in te maken in Krita hier in de handleiding.

Maar waarschijnlijk heeft u meer informatie nodig. Daarvoor moeten we kunnen zien wat er achter de asterisk is verborgen als u importeert* vanuit Krita. Om te leren welke Krita functies beschikbaar zijn en hoe u ze kunt gebruiken, zal u naar de Krita API reference documentatie moeten gaan.

Krita’s API

Deze pagina’s lijken op het eerste gezicht veel op jargon. Dit is zo omdat Krita’s API documentatie uit de onderliggende C++ taal komt waarin Krita is geschreven. De magie gebeurt door een Python onderdeel dat SIP wordt genoemd, die het mogelijk maakt voor python om in C++ te praten met Krita. Het eindresultaat is dat wanneer we krita importeren` en de functies aanroepen, we eigenlijk de C++ methoden gebruiken die in de documentatie worden genoemd.

Laten we meer in detail gaan kijken hoe dat werkt. Laten we een kijkje nemen op de tweede link, de Krita class documentatie. Daar kunnen we alle functies bekijken die beschikbaar zijn voor de Krita instance. Als u intypt dir(Krita.instance()) in Python, dan zou het deze pagina vrij snel moeten vinden - u kunt de documentatie bekijken voor de functies createDocument(), activeWindow(), en action() die we hierboven gebruikten.

Een van de dingen die erg verwarrend zijn aal de C++ classes die Krita gebruikt, inclusief de Qt classes die beginnen met een Q. Maar dit een van de mooie dingen vanSIP: het probeert de vertaling van deze classes naar Python zo eenvoudig en simpel mogelijk te houden. U kunt bijvoorbeeld zien dat defunctie filters() een QStringList geeft. SIP converteert echter die QStringLists naar een normale python list van strings!

from krita import *

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

Geeft als resultaat:

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

Echter, soms gaat de conversie niet zo goed.

from krita import *

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

Geeft iets als dit:

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

Het is een lijst met iets, zeker, maar hoe kunnen we er iets mee doen? Als we terug gaan naar de pagina met Krita apidocs en naar de documentatie van de functie kijken, dan zullen we zien dat er een klikbaar link bij de ‘documentatie’ van de class is. Als u die link volgt, dan kunt u lezen dat het document een functie heeft genaamd name() wat de naam van het document geeft, en de functies width() en height() die de afmetingen geven. Als we dus een rapport met informatie over de documenten in Krita willen genereren, dan kunnen we een script zoals dit schrijven:

from krita import *

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

We krijgen een resultaat zoals dit:

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

Hopelijk heeft u nu een idee hoe u door de API docs moet navigeren.

Krita’s API heeft nog veel meer classes, u kunt ze bekijken door naar de lijst links met de bovenste classes gaan, of door op hun naam te klikken om naar hun API docs te gaan. Ook de functies print() en dir() zijn uw vrienden. Deze regel geeft een lijst van alle actions in Krita – u kunt naar een van deze commando’s omwisselen in de ‘python_scriptmaker’ in het voorbeeld hierboven.

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

De Python module inspect was voor dit soort opdrachten ontworpen. Hier is een handige functie om informatie over een class on het terminalvenster te tonen.

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

getInfo(Krita.instance())

Tenslotte is er naast de LibKis documentatie ook nog de Qt documentatie, omdat PyQt door Krita wordt gebruikt om bijna alles van de Qt API voor Python toegankelijk te maken. U kunt op deze manier complete dialoogvenster met knoppen en formuleren bouwen, waarbij u dezelfde onderdelen gebruikt die Krita ook gebruikt! U kunt de Qt documentatie en de PyQt documentatie lezen voor meer informatie hierover, en zeker ook de meegeleverde plugins bestuderen voor hoe ze werken.

Technische details

Python scripts maken in Windows

Om Python scripting bij Windows 7/8/8.1 werkend te krijgen, moet u de Universal C Runtime from Microsoft’s website installeren. (Windows 10 komt er al meegeleverd.)

Python 2 en 3

Standaard is Krita gecompileerd voor python 3.

Het is echter mogelijk om het te compileren met python 2. Om dat te doen moet u het volgende toevoegen aan de configuratie-regel voor cmake:

-DENABLE_PYTHON_2=ON