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, 02:29   #1
schumaml
Erfahrener Benutzer
 
Benutzerbild von schumaml
 
Registriert seit: 21.01.2004
Ort: Leinfelden
Beiträge: 5.837
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 16:07 Uhr)
schumaml ist offline   Mit Zitat antworten
Alt 30.12.2007, 11:29   #2
TheGrudge
Erfahrener Benutzer
 
Benutzerbild von TheGrudge
 
Registriert seit: 26.01.2006
Beiträge: 2.204
Standard

Oh cool, wollte ja schon immer mal ein richtiges Plugin schreiben, dachte bis jetzt das geht nur in C. Muss ich doch irgendwann mal ausprobieren... danke für den Hinweise
TheGrudge ist offline   Mit Zitat antworten
Alt 30.12.2007, 15:57   #3
schumaml
Erfahrener Benutzer
 
Benutzerbild von schumaml
 
Registriert seit: 21.01.2004
Ort: Leinfelden
Beiträge: 5.837
Standard

Habe es noch mal angepasst, da das Beispiel sogar schon zu viel gemacht hat.

Ein paar Hinweise noch:
  • Man sollte GIMP von einer richtigen Konsole ausführen, um die print-Ausgaben zu sehen. Man sollte das generell tun, da dort auch Python seine Ausgaben schreibt - die Tracebacks sind hilfreich.
  • Nein, cmd.exe (Eingabeaufforderung) von Windows ist keine richtige Konsole. Man nehme MSYS mit bash (wobei es die auch einzeln gibt).
  • Ja, die Beispiele laufen auch unter Windows. Es ist sogar so, dass ich es momentan nur für diese Plattform sicher sagen kann
    Aber es gibt keinen Grund, anzunehmen, dass etwas daran plattformabhängig ist.
__________________
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 21:15 Uhr)
schumaml ist offline   Mit Zitat antworten
Alt 30.12.2007, 21:54   #4
MichaJo
Erfahrener Benutzer
 
Benutzerbild von MichaJo
 
Registriert seit: 30.09.2005
Beiträge: 1.390
Standard

Mal 'ne wirklich blöde Frage dazu: Gibt es unter Windows eine SDK für pyGTK?
Ich hab' (vielleicht noch nicht intensiv genug) bisher vergeblich nach so etwas gesucht.
Nach der Installation von pyGTK habe ich wohl eine Gtk-demo, aber das war's dann auch....


Gruß

Micha
__________________
Galeriebild

Es ist nctihs so efnicah, dsas man es nhcit flasch mehacn knnöte.
MichaJo ist offline   Mit Zitat antworten
Alt 30.12.2007, 21:59   #5
TheGrudge
Erfahrener Benutzer
 
Benutzerbild von TheGrudge
 
Registriert seit: 26.01.2006
Beiträge: 2.204
Standard

Zum Oberflächen basteln? Da sollte Glade ausreichend sein, XML basierte Beschreibung der GUI und somit nicht von Python abhängig. Aber ob es das auch für Windows gibt, weiß ich nicht. Ein spezieller Editor nur für pyGTK ist mir bis jetzt nicht bekannt.
TheGrudge ist offline   Mit Zitat antworten
Alt 30.12.2007, 22:36   #6
MichaJo
Erfahrener Benutzer
 
Benutzerbild von MichaJo
 
Registriert seit: 30.09.2005
Beiträge: 1.390
Standard

Jou, hab' jetzt auch ein pures Glade für Windows, ohne GTK+ etc. gefunden...
Ich bekomme zwar ein paar warnings über fehlende Komponenten...aber schaun mer mal.


Gruß

Micha
__________________
Galeriebild

Es ist nctihs so efnicah, dsas man es nhcit flasch mehacn knnöte.
MichaJo ist offline   Mit Zitat antworten
Alt 04.01.2008, 18:42   #7
Ravetracer
Erfahrener Benutzer
 
Registriert seit: 22.12.2005
Beiträge: 2.497
Standard

Zitat:
Zitat von schumaml Beitrag anzeigen
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()
Wie komme ich bei dieser Methode an das aktuelle Bild?
Über gimp.image_list() bekomme ich ja nur eine Liste, aber ich brauche das Image selbst, um dort Manipulationen usw. vornehmen zu können. Stehe gerade irgendwie auf dem Schlauch .
Ravetracer ist offline   Mit Zitat antworten
Alt 04.01.2008, 18:47   #8
TheGrudge
Erfahrener Benutzer
 
Benutzerbild von TheGrudge
 
Registriert seit: 26.01.2006
Beiträge: 2.204
Standard

Ich würde ja mal sagen:

Code:
image = gimp.image_list()[0] // lese erstes Bild aus, falls mehrere vorhanden sind
Die gebotenen Funktionen sieht man dann mit

Code:
dir(image)
in der Pythonconsole.
TheGrudge ist offline   Mit Zitat antworten
Alt 04.01.2008, 19:01   #9
Ravetracer
Erfahrener Benutzer
 
Registriert seit: 22.12.2005
Beiträge: 2.497
Standard

Mhh..
In der Konsole hab' ich das probiert und es geht auch wunderbar, nur wenn ich das
als Plugin ausführe, erscheint in der Fehlerausgabe:

Zitat:
LibGimpBase-ERROR **: gimp_wire_write_msg: the wire protocol has not been initialized
aborting...
Wenn ich dann gimp.image_list() wieder entferne (auskommentiere ) gehts...
Ravetracer ist offline   Mit Zitat antworten
Alt 04.01.2008, 19:06   #10
TheGrudge
Erfahrener Benutzer
 
Benutzerbild von TheGrudge
 
Registriert seit: 26.01.2006
Beiträge: 2.204
Standard

Ich muss vielleicht mal in mein Python-Script schauen (Molten Material), das sollte sich ja ähnlich einem Plugin verhalten. Im Moment habe ich leider kaum Zeit, lasse morgen meine Diplomarbeit drucken und binden (oh man is die schlecht geworden) und bin ein wenig in Eile, mir fehlt noch ein Kapitel
Dann darf ich Samstag und Sonntag schnell noch das Programm schreiben, naja nicht komplett, aber einen Großteil und am Montag ist Abgabe.

So genug OFF, ich finde die image_list() Funktion auch komisch, denn eigentlich sollte das Plugin doch in der Regel auf das aktuell aktive Bild angewandt werden. Ich glaube aber nicht das in der image_list() das aktive Bild immer an Position 0 steht.

Vielleicht gibt es ja noch eine andere Methode... *zu schumaml blick*...
TheGrudge ist offline   Mit Zitat antworten
Antwort

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 22:38
PlugIns für Newbies micha0816 GIMP-Ressourcen 4 25.09.2005 14:10


Alle Zeitangaben in WEZ +2. Es ist jetzt 08:57 Uhr.


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