Aus Raspberry Pi Geek 04/2022

Mit Yad schnell komplexe Shell-Dialoge erstellen

© Hannu Viitanen / 123RF.com

Dialogbereit

Karsten Günther

Yad erzeugt in Shell-Skripten einfache bis komplexe Dialoge. Ganz ohne Tücken funktioniert das sehr leistungsfähige Tool allerdings nicht.

Bei Yad [1] handelt es sich um einen Fork des früher häufig benutzten Programms Zenity [2], den der Entwickler Victor Ananjevsky seit vielen Jahren kontinuierlich weiterentwickelt. Er konzipierte Yad für den direkten Einsatz in der Standard-Shell Bash. Das Tool nimmt Eingaben entgegen und produziert grafisch aufbereitete Ausgaben. Ein Artikel aus der Ausgabe 06/2014 unserer Schwesterzeitschrift LinuxUser fasst die damals zur Verfügung stehenden Dialogtypen zusammen [3]. Inzwischen kamen neue Dialoge hinzu, etwa Benachrichtigungen in Form einfacher Menüs.

In vielen Fällen lassen sich mit Yad auf sehr einfache Weise gute Ergebnisse erzielen, manchmal bedarf es aber auch einer Vor- oder Nachbereitung der Daten. In diesem Artikel geht es zunächst einmal um einfache Beispiele.

Zähler und Countdown

Ein einfacher Zähler, der im Sekundentakt von 1 bis 10 zählt und damit eine einfache Stoppuhr simuliert, lässt sich mit Yad in einer Zeile realisieren (Listing 1, Zeile 1). Die runden Klammern erzeugen in diesem Beispiel in der Bash eine Sub-Shell, deren Ausgaben via Pipe bei Yad landen. Die Sub-Shell führt die For-Schleife durch die Anweisung sleep 1 im Sekundentakt aus. $(seq 1 10) erzeugt dabei die gewünschte Zahlenfolge von 1 bis 10 (Abbildung 1).

Listing 1

Zähler und Countdown

( for i in $(seq 1 10); do echo $i; sleep 1; done ) | yad --progress
[...] | yad --progress --title=Countdown --geometry=200x50
( for i in $(seq 0 10 100); do echo "#$i"; sleep 1; done ) | yad --progress --auto-close --geometry=300x50
yad --timeout-indicator=top --timeout=5
yad --timeout-indicator=top --timeout=3 ; if [ $? -eq 70 ] ; then echo TIMEOUT ; fi
Abbildung 1: Um einen einfachen Z&auml;hler zu generieren gen&uuml;gt der Aufruf <code>yad --progress</code>.

Abbildung 1: Um einen einfachen Zähler zu generieren genügt der Aufruf yad --progress.

Das Beispiel lässt sich beliebig anpassen und erweitern. Zunächst versieht Yad die Anzeige des aktuellen Werts mit einem Prozentzeichen. Um das zu verhindern, hilft es, bei der Ausgabe der Zahlenfolge eine Raute (#) voranzustellen. Dann interpretiert Yad die Daten als reine Werte. Den Code echo $i ersetzen Sie dafür durch echo "# $i". Das Leerzeichen zwischen der Raute und $i dient nur der besseren Lesbarkeit und hat sonst keine weitere Bedeutung. Alternativ funktioniert der Zähler auch als Countdown. In diesem Fall muss die mittels seq erzeugte Zahlenfolge also umgekehrt erscheinen. Dafür sorgt die Anweisung seq 10 -1 1.

Auch das Ändern der Fensteroptik steuert Yad über Optionen. Die Dimensionen passen Sie mit --width und --height an, die Angabe erfolgt in Pixeln. Zusammengefasst funktioniert das auch via --geometry. Die Anweisung --title versieht das Fenster mit einem Titel. Enthält das Argument Leerzeichen, muss es zwischen doppelten Hochkommas stehen (Listing 1, Zeile 2) (Abbildung 2).

Abbildung 2: Mit wenigen Optionen gestaltet Yad die Ausgabe als Countdown und versieht das in seiner Gr&ouml;&szlig;e festgelegte Fenster mit einem Titel.

Abbildung 2: Mit wenigen Optionen gestaltet Yad die Ausgabe als Countdown und versieht das in seiner Größe festgelegte Fenster mit einem Titel.

Nun benötigt das generierte Fenster möglicherweise gar keinen Close-Button, der in unserem Beispiel viel zu groß ausfällt. Die Anweisung --no-buttons unterdrückt dessen Darstellung. Für Fälle, in denen das Zählen aufwärts erfolgt, kennt Yad noch die Option --auto-close. Sie bewirkt, dass sich der erzeugte Dialog automatisch beim Erreichen des Endwerts schließt (Listing 1, Zeile 3).

Es gibt aber auch eine ganz andere Möglichkeit, einen Countdown-Zähler zu realisieren, Yad kennt einen eigenen, speziellen Modus dafür. Mit der Option --timeout lässt sich das Schließen der Dialogfenster und das Terminieren von Yad selbst festlegen. Auf Wunsch zeigt die Option --timeout-indicator (Abbildung 3) dazu auch einen Verlaufsbalken an (Listing 1, Zeile 4). Solange Sie nur eine Anzeige benötigen, gestalten sich beide Varianten mehr oder weniger identisch. Wenn es aber darum geht, die verstrichene Zeit für etwas zu nutzen, dann wandelt sich die reine Darstellung zu einer im Skript zu verarbeitenden Eingabe.

Abbildung 3: Auf Wunsch blendet Yad auch einen Verlaufsbalken im Fenster ein.

Abbildung 3: Auf Wunsch blendet Yad auch einen Verlaufsbalken im Fenster ein.

Yad kennt zwei Arten von Rückgaben: Der Standardausgabekanal gibt Werte (Texte oder Zahlen) aus, die sich in normalen Variablen speichern lassen. Unabhängig davon generiert der Befehl aber auch einen klassischen, von der Situation abhängigen Rückgabewert, wie ihn die meisten Programme auf der Shell erzeugen. Wie immer bedeutet der Rückgabewert 0: alles in Ordnung, keine besonderen Vorkommnisse. Alle anderen Rückgabewerte weisen auf Besonderheiten wie etwa Fehler hin. Wenn Yad einen Dialog aufgrund eines abgelaufenen Timeouts terminiert, erzeugt es stets den Rückgabewert 70. Um diese Exit-Codes auszuwerten, verwenden Sie die interne Bash-Variable $?, die den Rückgabewert des zuletzt ausgeführten Befehls enthält (Listing 1, Zeile 5).

Es gibt noch viele weitere Optionen, die bei den unterschiedlichsten Dialogtypen eine Rolle spielt. Die wichtigsten fasst die Tabelle “Wichtige allgemeine Optionen von Yad” zusammen.

Option

Funktion

--title=Zeichenkette

Setzt den Fenstertitel.

--window-icon=Icon

Definiert ein Icon für das Fenster.

--width=Breite, --height=Höhe

Stellt Breite und Höhe des Dialogfensters ein.

--posx=Anzahl, --posy=Anzahl

Legt die Position des Dialogfensters von der linken oberen Bildschirmecke fest.

--geometry=BreitexHöhe+X+Y

Fasst --width, --height, --posx und --posy zusammen; --pos* ignoriert Yad dann.

--timeout=Sekunden

Zeit bis zum automatischen Beenden des Dialogs. Als Return Code generiert Yad 70.

--timeout-indicator=Position

Mögliche Werte für die Position: top, bottom, left, right. Fehlt diese Angabe, erscheint kein Timeout-Anzeiger, obwohl Yad das Timeout berücksichtigt.

--text=Zeichenkette, --text-width=Breite, --text-align=Typ

Definiert einen im Dialogfenster angezeigten Text, die dafür verwendete Breite der Textbox und die Textausrichtung darin.

--image=Bild

Ein kleines Bild oder Icon, das in Originalgröße am linken Rand des Dialogfensters erscheint.

--icon-theme=Theme

Erlaubt ein anderes als das voreingestellte Icon-Theme zu verwenden.

--keep-icon-size

Behält die Originalgröße von Icons bei.

--image-path=Pfad

Legt einen Pfad fest, unter dem Yad zusätzlich nach Icons sucht. Die Option lässt sich auch mehrfach angeben.

--selectable-labels

Text lässt sich aus dem Dialogfenster heraus ins Clipboard kopieren.

--bool-fmt=Typ

Erzeugt abweichende Ausgaben für logische Ausdrücke; voreingestellt verwendet Yad TRUE und FALSE. t erzeugt true und false. Y und y geben yes und no in Groß- beziehungsweise Kleinschreibung zurück. O beziehungsweise o liefern on oder off in Groß- beziehungsweise Kleinschreibung. 1 erzeugt 1 oder 0.

--rest=Datei

Liest Argumente beispielsweise für Listen (aber keine Optionen) aus der angegebenen Datei. Jede Zeile entspricht einem Argument.

--response=Exit-Code

Erlaubt es, einen anderen als den voreingestellten Rückgabewert 0 zu verwenden.

--css=Zeichenkette

Erlaubt GTK+, den CSS-Code aus dem angegebenen String zu verwenden. Enthält der Parameter einen Dateinamen mit Pfad, wertet Yad den Inhalt aus.

--hscroll-policy=Typ, --vscroll-policy=Typ

Legt fest, wie Yad horizontale und vertikale Rollbalken verwendet. Es gibt die drei Möglichkeiten auto, always und never.

Menüs gestalten

Eine der neueren Entwicklungen von Yad betrifft den Notification-Modus. Er ermöglicht auf einfache Weise und mit wenig Code das Erzeugen eigener Menüs. Dazu nutzen Notifications die bei den modernen Desktop-Environments vorhandenen speziellen Anzeigebereiche. Bei XFCE und vielen anderen befindet er sich in der Leiste beziehungsweise dem Panel oder lässt sich dort hinzufügen (Abbildung 4).

Abbildung 4: In diesem Bereich des Desktop-Environments erzeugt Yad seine Men&uuml;s.

Abbildung 4: In diesem Bereich des Desktop-Environments erzeugt Yad seine Menüs.

Eine Besonderheit bei Yads Notification-Menüs besteht in der extrem einfachen Syntax, was schon die Online-Hilfe zeigt (Listing 2). Die Option --notification erzeugt das Menü. Was darin steht, legt das Argument von --menu fest. Der Schalter --no-middle verhindert, dass Yad sich beendet, sobald Sie die mittlere Maustaste drücken, was voreingestellt geschieht. Die Größe von Icons, die Yad im Notification-Bereich anzeigt, stellen Sie mit dem Argument hinter --icon-size ein, der Schalter --hidden unterdrückt eine Anzeige des Icons. Allerdings funktionieren dann auch keine Menüs mehr.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben