Python ile Betik Yazımına Giriş

4.0 sürümünde geldi.

Kickstarter Stretch Goal’larımızdan biri olarak vektörler ve metnin yanında Python ile Betik Yazımı’nı önerdiğimizde, destekçilerin oylarını açık farkla kazandı. Hatta kimisi yalnızca Python’u seçti ve başka hiçbir şey seçmedi. Peki Python ile Betik Yazımı tam olarak nedir?

Python ile Betik Yazımı Nedir?

Python, görevleri otomatikleştirmek için kullanılabilen bir betik yazımı dilidir. Krita’daki Python ile betik yazımının anlamı, Krita’ya bir API eklememizdir; bu, Python’un Krita’nın bazı bölümlerine erişmesine izin veren bir programlama parçasıdır. Bununla paneller yapabilir, birçok farklı dosya üzerinde önemsiz görevler gerçekleştirebilir ve hatta kendi dışa aktarıcılarımızı yazabiliriz. VFX ve video oyunu sanatçıları gibi bilgisayar grafikleriyle çalışan insanlar, görüntü sayfaları gibi şeyler yapmak, dışa aktarma bölümlerini otomatikleştirmek ve daha fazlası için Python’u çok sık kullanıyor.

Size Python’un kendisini öğretmek bu kılavuzun kapsamı dışındadır. Ancak, Python son derece popüler bir programlama dili olduğundan ve yeni başlayanlar için harika olduğundan, basit bir ‘python öğren’ internet aramasıyla hızlı bir şekilde bulunabilecek tonlarca öğrenme malzemesi vardır.

Bu kılavuz bunun yerine Krita’yı otomatikleştirmek ve genişletmek için Python’un nasıl kullanılacağına odaklanacaktır. Bunun için önce temel bilgilerle başlayacağız: Python komutlarının betikte nasıl çalıştırılacağı.

Betikleyici Eklentisini Etkinleştirme

Betikleyici eklentisi Python kullanmak için gerekli değildir; ancak Python ile sınamak ve oynamak için çok yararlıdır. Küçük betikler yazmak ve bunları anında çalıştırmak için kullanılabilen, Python ile yazılmış bir Python konsoludur.

Betikleyiciyi açmak için Araçlar ‣ Betikler ‣ Betikleyici yolunu izleyin. Eğer listede yoksa Ayarlar ‣ Krita’yı Yapılandır… ‣ Python Eklentisi Yöneticisi yolunu izleyin ve etkinleştirmek için listede “Betikleyici”yi tıklayın. Krita’nın güncel bir sürümünü kullandığınızdan emin olun.

Betikleyici, üstte bir metin düzenleyici penceresi ve altta bir çıktı penceresi ile açılacaktır. Metin alanına aşağıdakileri girin:

print("merhaba dünya")

Betiği çalıştırmak için büyük “Oynat” düğmesine veya Kontrol + R kısayoluna basın. Çıktı alanında aşağıdakileri görmelisiniz:

==== Warning: Script not saved! ====
merhaba dünya

Artık Python ortamından print() gibi işlevleri çalıştırabileceğimiz bir konsolumuz var - ancak Krita’yı yönetmek için bunu nasıl kullanabiliriz?

Temel Krita komutlarını çalıştırmak

Python’un Krita ile iletişim kurabilmesini sağlamak için Krita modülünü kullanacağız; en tepeye from krita import * yazıyoruz.

Bu, Krita ile Krita.instance() üzerinden konuşmamızı sağlıyor. Python ile kodlama yeteneklerimizi geliştirmeye çalışalım.

from krita import *

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

İkinci bir betikleyici penceresinin açıldığını görmelisiniz. Çok güzel! İşte biraz daha gelişmiş bir örnek.

from krita import *

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

Bu yeni bir belge açacaktır. Açıkçası Python, Krita’yı otomatikleştirmek için size oldukça fazla denetim sağlıyor. Zaman içinde topluluğun, yalnızca betiğe yapıştırarak kullanabileceğiniz her türlü betiği yazmasını bekliyoruz.

Peki ya kendiniz için yeni komutlar yazmak istiyorsanız? Başlamak için en iyi yer çok basittir: Başkalarının yazdığı örnekleri arayın! Eğer bir başkası sizin çalışmanızı temel alabileceğiniz bir kod yazmışsa çok zaman kazanabilirsiniz. Ayrıca /share/krita/pykrita konumunda bulunan Python eklentilerine de bakabilirsiniz. Ayrıca kılavuzda Krita’da Python eklentisi yapımı için adım adım bir kılavuz var.

Ancak yine de biraz daha fazla bilgiye gereksiniminiz olacaktır. Bunun için, import * from Krita yazdığınızda yıldız simgesinin ardında neler olduğunu öğrenmekle başlayabilirsiniz. Hangi Krita işlevlerinin kullanılabilir olduğunu ve onların nasıl kullanılacağını öğrenmek için Krita API başvuru belgelendirmesine bakmak isteyeceksiniz.

Krita API’si

Bu sayfalar ilk başta çok fazla jargon gibi görünebilir. Bunun nedeni Krita’nın API belgelendirmesinin Krita’nın yazıldığı temel C++ dilinden geliyor olmasıdır. Sihir, Python’un C++ dilinde konuşmasını ve Krita ile konuşmasını olanaklı kılan SIP adlı bir Python aracı sayesinde gerçekleşir. Sonuç olarak, import krita yaptığımızda ve işlevleri çağırdığımızda, aslında bu belgelendirmede listelenen C++ yöntemlerini kullanıyoruz.

Bunların nasıl çalıştığına biraz daha ayrıntılı bakalım. İkinci bağlantıdaki Krita sınıfları başvurusunu açın. Burada, Krita örneğinin kullanımına açık olan tüm işlevleri görebiliriz. Python’da dir(Krita.instance()) yazdığınızda, bu sayfa ile hemen hemen aynı olur - createDocument(), activeWindow() ve yukarıda kullandığımız action() işlevlerinin belgelendirmesi kullanılabilirdir.

En kafa karıştırıcı şeylerden biri, Q ile başlayan Qt sınıfları da dahil olmak üzere Krita’nın kullandığı tüm C++ sınıflarını görmektir. Ancak SIP’in güzelliği buradadır: Bu sınıflardan Python’a çeviriyi olabildiğince basit ve anlaşılır hale getirmeye çalışır. Örneğin, filters() işlevinin bir QStringList döndürdüğünü görebilirsiniz. Ancak, SIP bu ``QStringList``leri normal python dizi listesine dönüştürür!

from krita import *

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

Şu çıktıyı verir:

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

Ancak dönüşüm bazen beklendiği gibi pürüzsüz gitmeyebilir.

from krita import *

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

Şöyle bir çıktı verir:

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

Eğer bu bir şeyler listesiyse tamam, olur; ancak bunu nasıl kullanırız? Krita API’si sayfalarına gidip documents() işlevine baktığımızda, ‘Document’ sınıfı için gerçekte tıklanabilir bir bağlantı olduğunu görürüz. Eğer bu bağlantıyı izlerseniz belgenin, belgenin adını döndüren bir name() ve belgenin boyutlarını döndüren width() ve height() işlevlerine sahip olduğunu görürsünüz. Krita’daki belgeler hakkında bir rapor hazırlamak istersek şöyle bir betik yazabiliriz:

from krita import *

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

Şöyle bir çıktı alırız:

==== Warning: Script not saved! ====
Adsız
 2480x3508
eskiz21
 3508x2480
Mavi sabah
 1600x900

Umarım bu size API belgelerinde nasıl gezineceğiniz konusunda bir fikir verecektir.

Krita API’sinin daha pek çok sınıfları vardır; onlar hakkında ek bilgiyi sol üstteki sınıf listesine giderek veya API belgelerine ulaşmak için üzerilerine tıklayarak erişebilirsiniz. print() veya dir() işlevleri de sizin arkadaşlarınız olacaktır. Bu satır, Krita’daki tüm eylemlerin bir listesini yazdırır – yukarıdaki örnekte ‘python_scripter’ yerine bu komutların birini koyabilirsiniz.

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

inspect Python modülü, tam da bu iş için tasarlanmıştır. Konsola bir sınıf üzerine bilgi yazdırmak için kullanışlı bir işlevi aşağıda bulabilirsiniz.

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

getInfo(Krita.instance())

Son olarak, LibKis belgelendirmesine ek olmak üzere, Qt belgelendirmesi de pek yararlıdır; çünkü Krita tüm Qt API’sini Python’a sunmak için PyQt kullanır. Bu yolla, yalnızca Krita’nın aynısını kullandığı tüm araçları kullanarak pencereleri ve formları yapabilirsiniz! Bunun hakkında daha fazla bilgi için Qt belgelendirmesini ve PyQt belgelendirmesine bakabilirsiniz. Eklentilerin nasıl çalıştığını öğrenmek için içerilen eklentilerin içeriğine de bakmayı unutmayın.

Teknik Ayrıntılar

Windows Üzerine Python ile Betik Yazımı

Python ile betik yazımını Windows 7/8/8.1 üzerinde çalıştırmak için Microsoft’un web sayfasından Universal C Runtime’ı indirmeniz gerekir (Windows 10 halihazırda bununla gelir).

Python 2 ve 3

Öntanımlı olarak, Krita, Python 3 için derlenir.

Ancak yine de Python 2 ile derlemek de olanaklıdır. Bunun için cmake yapılandırma satırına şunu ekleyin:

-DENABLE_PYTHON_2=ON