Forum Wiki Galerie Kontakt Wie man Fragen richtig stellt. Tutorial Forum
Zurück   GIMP-Forum 3.0 > Arbeiten mit Gimp > GIMP-Ressourcen > Plug-ins

Hinweise
Alt 30.12.2007, 01:29   #1
schumaml
Erfahrener Benutzer
 
Benutzerbild von schumaml
 
Registriert seit: 21.01.2004
Ort: Leinfelden
Beiträge: 6.121
Standard Plugins in Python - und zwar richtig

Das man für GIMP Plugins in Python schreiben kann, dürften einige schon wissen. Das das mittlerweile auf allen Plattformen funktionieren sollte - zumindest Linux und Windows, wie sieht es denn bei OS X aus? - vermutlich auch.

Weniger bekannt ist vermutlich, das es zwei verscheidene Arten gibt, wie man das machen kann:

1. Ein "Skript" in Python schreiben

Das unterscheidet sich nur in der Syntax von Script-Fu, aber insbesondere die Oberfläche ist den gleichen Beschränkungen unterworfen:
  • man legt Art und Anzahl der Parameter fest
  • man definiert, welche Funktion aufgerufen wird
  • man definiert, wie der Menüeintrag heißt
Das reicht für vieles aus. Was aber, wenn man bei Start von GIMP etwas machen möchte? Oder die Oberfläche selbst mit GTK+ gestalten? Oder etwas ganz verrücktes wie einen XMLRPC-Server an GIMP anflanschen?

Das wird als Skript etwas umständlich bis unmöglich. Aber es gibt noch eine weitere Möglichkeit

2. Ein Plugin in Python schreiben

Es gibt dafür sogar ein Beispiel in gimpplugin.py:

Code:
#   import gimp, gimpplugin
#
#   pdb = gimp.pdb
#
#   class myplugin(gimpplugin.plugin):
#       def query(self):
#           gimp.install_procedure("plug_in_mine", ...)
#
#       def plug_in_mine(self, par1, par2, par3,...):
#           do_something()
#
#   if __name__ == '__main__':
#       myplugin().start()
Leider, leider, sind die wesentlichen Teile nicht vollständig vorhanden, und es fehlt auch noch sonst so was...

Das sollte eher wie folgt aussehen:

Code:
import gimp, gimpplugin
from gimpenums import *
pdb = gimp.pdb

class minimalplugin(gimpplugin.plugin):
    def query(self):
        print "query\n"
        gimp.install_procedure("reallyminimal",
                               "This is a even more minimal *real*, non-gimpfu python plugin",
                               "", "Michael Schumacher", "Michael Schumacher",
                   "2007", "<Toolbox>/Xtns/Even more Minimal *Real* Python", "", PLUGIN,
                   [(PDB_INT32, "run_mode", "Run mode")], [])

    def reallyminimal(self, par1):
        print "moreminimal"
        pass
            
if __name__ == '__main__':
    minimalplugin().start()
  • ein import mehr
  • alle Einsprungpunkte sind vorhanden
  • es erscheint wirklich etwas im Menü
Das reicht, um ein Plugin zu schreiben, das wie 99% aller anderen Plugins arbeitet. 99% der Python-Plugins, die ab jetzt entstehen, sollten diese Struktur (aber natürlich viel mehr Code, der wirklich etwas macht) haben.

Man kann aber noch ein paar Schritte weitergehen.

gimpplugin.plugin ist eine Klasse, von der unser Plugin erbt. Nun ist es möglich, deren Methoden neu zu definieren, z. B. wie folgt:

Code:
import gimp, gimpplugin
from gimpenums import *
pdb = gimp.pdb

class minimalplugin(gimpplugin.plugin):
    def start(self):
        gimp.main(self.init, self.quit, self.query, self._run)

    def init(self):
        print "init\n"

    def quit(self):
        print "quit\n"

    def query(self):
        print "query\n"
        gimp.install_procedure("minimal",
                               "This is a minimal *real*, non-gimpfu python plugin",
                               "", "Michael Schumacher", "Michael Schumacher",
                   "2007", "<Toolbox>/Xtns/Minimal *Real* Python", "", PLUGIN,
                   [(PDB_INT32, "run_mode", "Run mode")], [])

    def minimal(self, par1):
        print "minimal"
        pass
            
if __name__ == '__main__':
    minimalplugin().start()
  • start(self)
    Definiert, welche Funktionen denn nun wirklich init, quit, query und run implementieren. Normalerweise definiert man die in seinem eigenen Plugin nicht neu, da die schon in der Oberklasse passend gesetzt ist. Aber, es geht.
  • init(self)
    Wird immer dann aufgerufen, wenn GIMP neu gestartet wird. Das ist z.B. dann sinnvoll, wenn man temporäre Einträge im Menü registrieren möchte, die vom Systemzustand abhängen. Beispiel: falls eine Kamera XYZ angeschlossen ist (und nur dann), soll im Menü ein "Bilder von XYZ importieren" auftauchen. Es ist dann eine gute Idee, ebenfalls einen Eintrag "Geräte aktualisieren" anzubieten, mit dem man das ohne Neustart machen kann. Hallo XSane- und xscanimage-Entwickler, das ist ein Wink mit dem Zaunpfahl...
  • quit(self)
    Wird immer dann aufgerufen, wenn eine der anderen Methoden (also init, query, die selbst installierten Methoden, ...) fertig ist. Normalerweise definiert man diese Funktion nicht neu. Man kann hier zum Beispiel an einer zentralen Stelle aufräumen, falls man das braucht.
  • query(self)
    Wird dann aufgerufen, wenn das Plugin als neu oder geändert erkannt wird. Hier legt man normalerweise die permanent vorhandenen Menüeinträge und die dabei aufgerufenen Methoden an. Hier ist das "minimal".
So wird Python eine richtige Alternative zu C, was GIMP-Plugins angeht - oder sogar noch besser, denn jeder, bei dem so ein Plugin läuft, kann ohne weitere Werkzeuge (C-Kompiler, Linker, autotools, ...) daran auch Änderungen vornehmen.


Weiterführende Links:

Python
http://www.python.org - auch z.B. Installer für Windows. Und Dokumentation. Viel davon, Tutorial unbedingt durchlesen.

GIMP Python Documentation
http://www.gimp.org/docs/python/index.html - GIMP-Funktionen und wie man sie in Python verwendet.

PyGTK
http://www.pygtk.org/ - für die Oberfläche des eigenen Plugins in GTK+. Man sollte hier in zunehmendem Maße wissen, was man tut (Grund #1, warum das Beispiel noch keine Oberfläche hat) - und falls dem nicht so ist, gibt es dort ein Tutorial.
__________________
Komm in den Chat! irc://irc.freenode.net/#gimp-de
Verwendete GIMP-Versionen: gimp-2-8, 2.8.4, Git master
Technische Lösungen gegen Spammer - für Privatpersonen, Arbeitsgruppen und Unternehmen

Geändert von schumaml (30.12.2007 um 15:07 Uhr)
schumaml ist offline   Mit Zitat antworten
 

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Plugin] PHotoshop Plugins in GIMP Arathis GIMP-Ressourcen 24 21.01.2010 21:38
PlugIns für Newbies micha0816 GIMP-Ressourcen 4 25.09.2005 14:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 04:24 Uhr.


Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.