Ово упутство ће вас научити основама писања Пајтон прикључака за Гимп 3.0. Очекује се да већ поседујете основно знање о писању Пајтона уопште. Ако не, постоји довољно онлајн курсева Пајтона, па их овде нећемо понављати.
Гимпови прикључци у Пајтону (као и у другим језицима) позивају се из самог Гимпа ради извршавања одређених радњи. Да би знао како да комуницира са прикључком и како да га позове, Гимп мора да зна под којим именом да га позове и које функције он подржава.
Постоје одређени захтеви у погледу имена датотеке и имена директоријума прикључка, који морају бити исти. За више детаља погледајте Инсталирање нових прикључака.
Размотрићемо основне делове прикључка који су неопходни, или барем врло чести за рад са Гимпом.
На Линуксу и мекОС-у је неопходно, а на Виндоузу је уобичајена пракса, почети са такозваним „shebang“ или „hashbang“ записом, кодирањем и обавештењем о ауторским правима. Прва линија је shebang, који одређује како се ова скрипта може извршити. Следећа линија одређује кодирање Пајтон датотеке. Препоручујемо utf-8. Обично следи неколико линија које наводе лиценцу под којом објављујете скрипту и кратак опис онога што скрипта ради. Нећемо улазити дубље у ово, јер је то заједничко за Пајтон уопште.
Увоз потребних модула ради приступа Гимповим и, опционално, ГЕГЛ функцијама.
Декларишите класу са неколико унапред дефинисаних функција које треба да прилагодите, тако да Гимп зна које су функције доступне у вашем прикључку и коју функционалност подржавају. О томе ћемо детаљније говорити у наставку.
Позив који покреће ваш прикључак или испитује његове могућности, у зависности од аргумената које му шаље Гимп.
Да бисмо могли да приступимо Гимповим функцијама, почињемо са import gi. Овај модул може да сазна које су функције доступне у сваком модулу дефинисаном путем „интроспекције објеката“. За нас то значи да увозимо све модуле повезане са Гимпом који нам могу затребати путем позива gi.repository.
За основну функционалност могу бити довољни само модули Gimp и GimpUi. Ако желите да покренете свој прикључак из линије наредби, GimpUi вам чак није ни потребан. Почнимо са примером.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# GIMP - The GNU Image Manipulation Program
# Copyright (C) 1995 Spencer Kimball and Peter Mattis
#
# gimp-tutorial-plug-in.py
# sample plug-in to illustrate the Python plug-in writing tutorial
# Copyright (C) 2023 Jacob Boerema
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import sys
import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
from gi.repository import GLib
Почињемо увозом модула sys, који нам је потребан на крају за приступ sys.argv, након чега import gi говори Пајтону да треба да учита модул gi. Овај модул се користи да омогући приступ специфичним Гимповим функцијама путем „интроспекције објеката“.
У следећој линији говоримо модулу gi да захтевамо да верзија Гимповог АПИ-ја буде 3.0. (Овај прикључак неће радити са старијим верзијама Гимпа.) Следећа линија захтева увоз свих функција, класа итд. из модула Gimp.
Следећа два реда раде исту ствар за GimpUi. GimpUi садржи све елементе везане за корисничко сучеље за ГИМП. Ако планирате да направите прикључак који ће се позивати само са линије наредби, онда вам ово неће требати. Завршавамо са увозом GLib-а, који ће нам касније требати за приступ GLib.Error-у.
Постоје и други опциони модули које такође можете користити, као што је Gegl и многи други, али овде нећемо улазити у то.
ГИМП треба да зна које су функције доступне, коју функционалност подржавају и коју локацију менија да користе. За то дефинишемо класу која је изведена из класе Gimp.PlugIn.
Минимални прикључак мора имати барем следеће функције дефинисане у овој класи:
Метод do_query_procedure, који ГИМП позива да би сазнао називе процедура које се могу позвати у овом прикључку.
Метод do_set_i18n, који ГИМП позива да би сазнао да ли ваш прикључак подржава преводе.
Метод do_create_procedure, који ГИМП позива да би покренуо једну од функција вашег прикључка. Када се ово позове, требало би да иницијализујете одређене податке за ГИМП. Почињете прављењем процедуре која говори ГИМП-у назив Пајтон функције коју треба позвати за покретање вашег прикључка. Затим достављате додатне податке, као што су врсте слика које ваш прикључак подржава, где у менију треба да се нађе ваш прикључак и друга опциона подешавања.
Стварна функција (коју ГИМП назива процедуром) коју сте навели изнад. Ово често називамо run, али може имати било који назив који Пајтон дозвољава. Ова функција је место где ћете додати сопствени код за примену жељених ефеката.
Сада ћемо ући у мало више детаља. Испод није укључен први део Пајтон кода који је приказан изнад. Ово приказује само основни распоред ваше класе.
class MyFirstPlugin (Gimp.PlugIn):
def do_query_procedures(self):
return [ "jb-plug-in-first-try" ]
def do_set_i18n (self, name):
return False
def do_create_procedure(self, name):
procedure = Gimp.ImageProcedure.new(self, name,
Gimp.PDBProcType.PLUGIN,
self.run, None)
procedure.set_image_types("*")
procedure.set_menu_label("My first Python plug-in")
procedure.add_menu_path('<Image>/Filters/Tutorial/')
procedure.set_documentation("My first Python plug-in tryout",
"My first Python 3 plug-in for GIMP 3",
name)
procedure.set_attribution("Your name", "Your name", "2023")
return procedure
def run(self, procedure, run_mode, image, drawables, config, run_data):
Gimp.message("Hello world!")
# do what you want to do, then, in case of success, return:
return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Погледајмо изблиза do_query_procedures. У реду return [ "jb-plug-in-first-try" ] говоримо ГИМП-у који је назив наше процедуре: зовемо је „jb-plug-in-first-try“. Ово је назив који ће бити приказан у ГИМП-овом Прегледнику процедура.
У прикључку можете имати дефинисано више од једне процедуре. У том случају бисте навели све називе, раздвојене зарезом.
Добра је пракса да све своје процедуре започнете својим иницијалима или неком другом препознатљивом и јединственом ознаком. На тај начин је мање вероватно да ће ваш назив бити исти као нечији туђи прикључак, што може збунити ГИМП. Осим тога, слободни сте да га назовете како желите.
Затим говоримо ГИМП-у да не подржавамо преводе враћањем False у позиву do_set_i18n. Шта треба да урадите када желите да ваш прикључак буде преведен је изван оквира овог упутства.
Метод do_create_procedure је место где се врши већина иницијализације за ГИМП.
Поступак 13.1. Подешавање do_create_procedure
Ако дефинишете више од једне процедуре у свом прикључку, прво морате да проверите параметар „name“ да бисте видели коју процедуру ГИМП позива. Овде нећемо улазити у то.
Да бисмо иницијализовали процедуру вашег прикључка, прво морамо да је направимо и попунимо назив наше Пајтон функције која ће обавити стварни посао. То радимо позивањем Gimp.ImageProcedure.new.
procedure = Gimp.ImageProcedure.new(self, name,
Gimp.PDBProcType.PLUGIN,
self.run, None)
У овом случају дефинишемо назив нашег прикључка као self.run. Када нашу функцију означимо са „self.“, то значи да је то метод унутар наше класе. Ако желите, можете је дефинисати и као обичну функцију изван ваше класе, у ком случају бисте изоставили „self.“. Називање „run“ није обавезно, можете јој дати било који назив који Пајтон прихвата.
Затим ћемо рећи ГИМП-у са којим врстама слика овај прикључак може да ради позивањем procedure.set_image_types. У случају да врста слике није битна, користимо „*“, што значи све врсте које ГИМП подржава. Остали примери:
"RGB*,GRAY*", где "*" овде значи да подржавамо обе верзије, са и без А(лфа) канала.
"INDEXED", прикључак ради само на индексираним сликама, без алфа канала.
"RGBA", прикључак ради само на RGB сликама са алфа каналом.
Могућност покретања прикључка из Гимповог изборника је обично добра идеја. Почињемо дефинисањем описног натписа за ставку изборника: procedure.set_menu_label.
Затим одређујемо где треба да се појави у изборнику: procedure.add_menu_path. У овом случају му кажемо да дода наш прикључак у изборник „Филтери“, под категорију (подмени) „Увежбавање“.
Ако желите, можете додати и додатни савет за помоћ коришћењем procedure.set_documentation, а своје име као аутора прикључка можете поставити коришћењем procedure.set_attribution.
Последња линија у поступку стварања је return procedure, која шаље горе додате податке назад у Гимп. Након овога, Гимп ће позвати ваш поступак покретања.
Сваки прикључак се покреће позивом Gimp.main.
Gimp.main(MyFirstPlugin.__gtype__, sys.argv)
Једина ствар коју треба да промените у овој линији за ваш прикључак је назив класе вашег прикључка, овде назване „MyFirstPlugin“.
Испод представљамо целу пајтон скрипту, која би требало да ради, под условом да јој је дат исправан назив у директоријуму са истим називом на месту које Гимп познаје. Приказаће поруку „Hello world!“ у конзоли за грешке или у искачућем прозорчету.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# GIMP - The GNU Image Manipulation Program
# Copyright (C) 1995 Spencer Kimball and Peter Mattis
#
# gimp-tutorial-plug-in.py
# sample plug-in to illustrate the Python plug-in writing tutorial
# Copyright (C) 2023 Jacob Boerema
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
import sys
import gi
gi.require_version('Gimp', '3.0')
from gi.repository import Gimp
gi.require_version('GimpUi', '3.0')
from gi.repository import GimpUi
from gi.repository import GLib
class MyFirstPlugin (Gimp.PlugIn):
def do_query_procedures(self):
return [ "jb-plug-in-first-try" ]
def do_set_i18n (self, name):
return False
def do_create_procedure(self, name):
procedure = Gimp.ImageProcedure.new(self, name,
Gimp.PDBProcType.PLUGIN,
self.run, None)
procedure.set_image_types("*")
procedure.set_menu_label("My first Python plug-in")
procedure.add_menu_path('<Image>/Filters/Tutorial/')
procedure.set_documentation("My first Python plug-in tryout",
"My first Python 3 plug-in for GIMP 3.0",
name)
procedure.set_attribution("Your name", "Your name", "2023")
return procedure
def run(self, procedure, run_mode, image, drawables, config, run_data):
Gimp.message("Hello world!")
# do what you want to do, then, in case of success, return:
return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS, GLib.Error())
Gimp.main(MyFirstPlugin.__gtype__, sys.argv)