Tkinter-Fenster in Gimp

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

gahleitner hat geschrieben:Gibt es eine Doku über die PF_ Module und deren Definitionen?
...
Kannst du mir helfen?
So, nun noch einmal zum Helfen.
Was verstehst Du unter Hilfe?

Nur aufzeigen, wie man etwas schreiben könnte, bringt ja nichts, wenn der andere am Ende nicht versteht, warum es so geschrieben werden könnte. Zum Verstehen gehören Grundkenntnisse in Python und zu diesen Grundkenntnissen wiederum gehören z.B. die wichtigsten Datentypen, wie String, Integer, Floot oder Bool und die stehen in jedem für Einsteiger geeigneten Buch recht weit vorn. Wenn man diese aber kennt, ist es einfach in der gimpfu.py nachzulesen, zu welchem Datentyp eine für die Parameterübergabe gebräuchliche Konstante gehört, insofern sich das nicht bereits aus dem Namen einer Konstanten ableiten lässt.
Wo die gimpfu.py bei Dir liegt, bekommst Du heraus, in dem Du in der Python-Fu Konsole einfach nur

[codebox=pycon file=Unbenannt.txt]import gimpfu
help(gimpfu)[/code]
eingibst, der Pfad zur Datei wird mit aufgeführt. Beispiel:

[codebox=pycon file=Unbenannt.txt]>>> import gimpfu
>>> help(gimpfu)

Help on module gimpfu:

NAME
gimpfu - Simple interface for writing GIMP plug-ins in Python.

FILE
c:\program files\gimp 2\32\lib\gimp\2.0\python\gimpfu.py[/code]
Die Konstanten plus Datentypen werden in den Dictionaries "_type_mapping" und "_obj_mapping" aufgeführt. Weiterhin sollte man die Beschreibung in der gimpfu.py mindestens einmal gelesen haben. Nun weiß ich nicht, wie Deine Englischkenntnisse sind, ich muss mir alles was wichtig ist zumindest erst einmal von Google übersetzen lassen, doch meisten sind die Übersetzungen verständlich genug.

Beispiel aus der gimpfu.py
[codebox=text file=Unbenannt.txt]You can use any of the PF_* constants below as parameter types, and anappropriate user interface element will be displayed when the plug-in is run in interactive mode. Note that the the PF_SPINNER and PF_SLIDER types expect a fifth element in their description tuple -- a 3-tuple of the form (lower,upper,step), which defines the limits for the slider or spinner.[/code]
Übersetzung mit Google:
[codebox=text file=Unbenannt.txt]Sie können eine beliebige der folgenden PF_ * Konstanten als Parametertypen verwenden und ein passendes Benutzerschnittstellenelement wird angezeigt, wenn das Plug-In im interaktiven Modus ausgeführt wird. Beachten Sie, dass die PF_SPINNER- und PF_SLIDER-Typen ein fünftes Element in ihrem Beschreibungstupel erwarten - ein 3-Tupel des Formulars (unten, oberer, Schritt), der die Grenzen für den Schieberegler oder den Spinner definiert.[/code]
Die zweite Quelle für Konstanten und anderes wäre dann diese bereits oft verlinkte Seite:

https://www.gimp.org/docs/python/

Die habe ich mir gleich zweisprachig ausgedruckt. Das hat dann zwar etwas länger als eine Stunde gedauert, weil ich die Übersetzungen absatzweise einfügte und die englischen Texte dabei etwas ausgraute, doch dafür habe ich etwas zu liegen, mit dem man gut arbeiten kann.

Aus dem Original:
[codebox=text file=Unbenannt.txt]These values map onto the standard PARAM_* constants. The reason to use the extra constants is that they give gimpfu more information, so it can produce a better interface (for instance, the PF_FONT type is equivalent to PARAM_STRING, but in the GUI you get a small button that will bring up a font selection dialog).

The PF_SLIDER, PF_SPINNER and PF_ADJUSTMENT types require the extra parameter. It is of the form (min, max, step), and gives the limits for the spin button or slider.

The results parameter is a list of 3-tuples of the form (type, name, description). It defines the return values for the function. If there is only a single return value, the plugin function should return just that value. If there is more than one, the plugin function should return a tuple of results.[/code]
Übersetzung mit Chrome ist etwas gebrochenes, dennoch verständliches Deutsch:
[codebox=text file=Unbenannt.txt]Diese Werte werden auf die Standard-PARAM_ * -Konstanten abgebildet. Der Grund, die zusätzlichen Konstanten zu verwenden, ist, dass sie gimpfu mehr Informationen geben, also kann es eine bessere Schnittstelle produzieren (zum Beispiel ist der PF_FONT-Typ äquivalent zu PARAM_STRING, aber in der GUI bekommst du eine kleine Schaltfläche, die eine Schriftartauswahl hervorbringt Dialog).

Die Typen PF_SLIDER, PF_SPINNER und PF_ADJUSTMENT benötigen den zusätzlichen Parameter. Es ist von der Form (min, max, step), und gibt die Grenzen für die Spin-Taste oder Schieberegler.

Der Ergebnisparameter ist eine Liste von 3-Tupeln des Formulars (Typ, Name, Beschreibung). Sie definiert die Rückgabewerte für die Funktion. Wenn es nur einen einzigen Rückgabewert gibt, sollte die Plugin-Funktion nur diesen Wert zurückgeben. Wenn es mehr als eins gibt, sollte die Plugin-Funktion ein Tupel von Ergebnissen zurückgeben.[/code]

Dann noch eine dritte Quelle, zwar in Scheme beginnend mit SF- und nicht mit PF_, doch dafür in deutscher Sprache und mit richtiger Beschreibung, so dass nur kleinere Anpassungen erforderlich sind:

https://docs.gimp.org/de/gimp-using-scr ... cript.html

Dann allgemein etwas zu den Beispielen, die sind alle gut und schön und die Leistung von den jeweiligen Script-Autoren sollte durchaus anerkannt werden. Nur die Beispiele sind halt in die Jahre gekommen und man sollte sich halt die "PEP 8 - Style Guide for Python Code" einmal durchlesen und eigene Scripts dann danach ausrichten. Auf der Vorseite verlinkt und auf dieser Seite übernimmst Du bereits wieder ein Beispiel mit Sternchenimport und Variablen in camelCase-Schreibweise, statt diese gleich zu korrigieren. Irgendwie so, als hättest Du Dir die Seite nicht einmal angeschaut, wo sich doch vieles bereits ohne zu lesen aus "Yes:" und "No:" ergibt.

Also, helfen ja, doch Hilfe ist auch darauf zu verweisen, wo sich Erklärungen und Lösungen befinden, statt diese nur wiedergeben zu wollen. Und da wurde bereits auf sehr vieles verwiesen, würde ich meinen.
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

Oben ist mir ein dummer Fehler passiert, Floot sollte selbstverständlich Float heißen.
Jedenfalls werden die Datentypen alle in der gimpfu aufgeführt.
gahleitner
User
Beiträge: 35
Registriert: Montag 1. Mai 2017, 09:57

Hallo!

Wie kann ich erreichen,dass das Skript auch das Bildformat erkennt - hab es mit if width>height und image_width, image_height versucht, konnte auch sonst nichts passendes finden.
Außerdem möchte ich auch ein Bild skalieren können, mit gimp_image_scale und gimp_context_set_interpolation gehts es schon ganz gut, aber die auflösung kann ich nirgends einstellen.
Wie ich schon mal geschrieben habe, möchte ich - wenn es möglich ist - das Skript auch ohne geöffnetes Bild starten. Wenn ich in register das Sternchen (*) entferne, geht es, aber es werden 2 zusätzliche Sachen (input Image und Input Drawable) angezeigt. Kann man das unterbinden?

@BlackJack: inputFolder + "\\" + file müßte also inputFolder + os.path.join() + file heißen, oder?

Tschüss
Gerhard
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nur zum letzten: nein. os.path.join(a, b, ...)
Melewo
User
Beiträge: 320
Registriert: Mittwoch 3. Mai 2017, 16:30

gahleitner hat geschrieben:Wie ich schon mal geschrieben habe, möchte ich - wenn es möglich ist - das Skript auch ohne geöffnetes Bild starten. Wenn ich in register das Sternchen (*) entferne, geht es, aber es werden 2 zusätzliche Sachen (input Image und Input Drawable) angezeigt. Kann man das unterbinden?
Und das hatte ich hier bereits geschrieben. Wenn bei der Registrierung die neue Reihenfolge nicht beachtet wird, greift ein "Notfallplan", beim dem es zu einer Zwangszuweisung von "file_params" kommt, damit ältere Plugins weiterhin lauffähig bleiben:

viewtopic.php?f=4&t=40877&start=15#p312607

Selbstverständlich muss darüber hinausgehend, wie bei allen Funktionen, die Anzahl der definierten Parameter mit denen im Funktionskopf übereinstimmen. Bei Deinen letzten Beispielen sehe ich aber

Code: Alles auswählen

def regle_schaerfe(image, layer, ...):
und somit müssen image und layer auch mit übergeben oder mit None belegt werden, wodurch die aber überflüssig wären.
Antworten