Python Skript für Gimp

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
BlackJack

@Melewo: Also die Definition sollte so aussehen:

Code: Alles auswählen

def erstelle_neues_image(image=None, ebene=None):
   ...
Und der Aufruf so:

Code: Alles auswählen

pdb.python_fu_erstelle_neues_image()
Wenn das nicht funktionieren sollte, dann ist ``pdb.python_fu_erstelle_neues_image`` eine automatisch generierte Funktion die doch wieder obligatorische Argumente hat, oder die Magie die diese Funktion erstellt erkennt keine Argumente mit Defaultwerten.

Dann kann man aber auch einfach `None` übergeben *ohne* den Wert vorher an irgendwelche Namen zu binden.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Die Definition sieht so aus mit (image=None, ebene=None).
Ja, hast Recht, der zweite Aufruf mit (None, None) hat funktioniert.

[codebox=pycon file=Unbenannt.txt]>>> pdb.python_fu_erstelle_neues_image()
Traceback (most recent call last):
File "<input>", line 1, in <module>
TypeError: wrong number of parameters
>>>
>>> pdb.python_fu_erstelle_neues_image(None, None)
>>> [/code]
Ich hatte die bisher mit Apply übernommen und da erschien die gleich so in der Console:

[codebox=pycon file=Unbenannt.txt]>>> pdb.python_fu_erstelle_neues_image(image, drawable)[/code]
Da könnte man sich zwei Zeilen beim Tippen dann sparen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Habe mir mal die gimpfu näher betrachtet. Wie in beinahe allen bisher gefundenen Beispielen hatte ich den "Menüpfad plus Label" bei "Label" angegeben und nach "function" nichts mehr.

Aus gimpfu.py:

Code: Alles auswählen

def register(proc_name, blurb, help, author, copyright, date, label,
             imagetypes, params, results, function,
             menu=None, domain=None, on_query=None, on_run=None):

Und das funktionierte, weil aus den Angaben bei Label dann der Menüeintrag erstellt wird, wobei dann aber nach einen von diesen 3 "<Load>", "<Image>", "<Save>" gefragt wird und params zugeordnet werden. Da könnten über menü = "" noch weitere Möglichkeiten sich eröffnen.

Aus gimpfu.py:

Code: Alles auswählen

    # if menu is not given, derive it from label
    need_compat_params = False
    if menu is None and label:
        fields = label.split("/")
        if fields:
            label = fields.pop()
            menu = "/".join(fields)
            need_compat_params = True

            import warnings
            message = ("%s: passing the full menu path for the menu label is "
                       "deprecated, use the 'menu' parameter instead"
                       % (proc_name))
            warnings.warn(message, DeprecationWarning, 3)

        if need_compat_params and plugin_type == PLUGIN:
            file_params = [(PDB_STRING, "filename", "The name of the file", ""),
                           (PDB_STRING, "raw-filename", "The name of the file", "")]

            if menu is None:
                pass
            elif menu.startswith("<Load>"):
                params[0:0] = file_params
            elif menu.startswith("<Image>") or menu.startswith("<Save>"):
                params.insert(0, (PDB_IMAGE, "image", "Input image", None))
                params.insert(1, (PDB_DRAWABLE, "drawable", "Input drawable", None))
                if menu.startswith("<Save>"):
                    params[2:2] = file_params

    _registered_plugins_[proc_name] = (blurb, help, author, copyright,
                                       date, label, imagetypes,
                                       plugin_type, params, results,
                                       function, menu, domain,
                                       on_query, on_run)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Es lag an dieser veränderten Reihenfolge und den überalterten Beispielen im Web, in denen beinahe ausnahmslos noch die ältere Reihenfolge verwendet wurde und es lag nicht zuletzt an mir, weil ich mir erst viel zu spät die gimpfu.py richtig betrachtete. Nun lässt es sich mit () definieren und abfragen.

Code: Alles auswählen

def erstelle_neues_image():   
[codebox=pycon file=Unbenannt.txt]>>> pdb.python_fu_erstelle_neues_image()[/code]
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Mit dem Import ohne Sternchen hat es nun geklappt, deshalb beide Beispiele noch einmal, bei denen keine "Problemchen" mehr auftraten. Als nächster Parameter bei der Registrierung könnte eine Textdomain gesetzt werden, falls ein Plugin mehrsprachig ausgelegt werden soll.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import main, register
import gimp

def erstelle_begruessung():
    gimpversion  = gimp.version                             # Tupel mit 3 Integer-Werten
    begruessung  = "Hallo Welt!\nGimp Version {}".format(
                   ".".join(map(str, gimpversion)))
    gimp.message(begruessung)

register(
    "erstelle_begruessung",                                 # Plugin Name gleich Funktions-Name
    "Begrüßung erstellen",                                  # Kurzbeschreibung
    "Einen Eintrag mit Begrüßung im Hilfe-Menü erstellen",  # Längere Beschreibung
    "Mele Melewo",                                          # Plugin Autor
    "MIT-Lizenz",                                           # Angaben zur Lizenz
    "2017",                                                 # Jahr der Veröffentlichung
    "Begrüßung",                                            # Label
    None,                                                   # Akzeptierte Image-Typen
    [],                                                     # Input Parameter
    [],                                                     # Output Resultate
    erstelle_begruessung,                                   # Name der Methode (warum Methode und nicht Funktion?)
    menu="<Image>/Help/Hinweise"                            # Position im Menü
    )

main()

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from gimpfu import pdb, register, main, RGB, RGB_IMAGE, NORMAL_MODE, BACKGROUND_FILL

def erstelle_neues_image():
    width  = 600
    height = 400

    # Ein neues Image erzeugen.
    image = pdb.gimp_image_new(width, height, RGB)
    # Für das Image mindestens eine Ebene erzeugen und die Ebene hinzufügen.
    ebene = pdb.gimp_layer_new(
            image, width, height, RGB_IMAGE, "ebenen-name", 100, NORMAL_MODE)
    pdb.gimp_image_insert_layer(image, ebene, None, 1)
    # Eine Hintergrundfarbe auswählen und das Image damit füllen.
    pdb.gimp_context_set_background((255,138,0))
    pdb.gimp_drawable_fill(ebene, BACKGROUND_FILL)
    # Da neu erzeugte Image anzeigen.
    pdb.gimp_display_new(image)


register(
    "erstelle_neues_image",                       # Plugin Name
    "Neues Image erstellen",                      # Kurzbeschreibung
    "Ein neues Image erstellen",                  # Längere Beschreibung
    "Mele Melewo",                                # Plugin Autor
    "MIT-Lizenz",                                 # Angaben zur Lizenz
    "2017",                                       # Jahr der Veröffentlichung
    "Neues Image",                                # Label
    "*",                                          # Akzeptierte Image-Typen
    [],                                           # Input Parameter
    [],                                           # Output Resultate
    erstelle_neues_image,                         # Name der Funktion
    "<Image>/Filters/Eigene"                      # Position im Menü
    )

main()
Antworten