GUI-Dialoge im Terminal

  Ralf Hersel   Lesezeit: 4 Minuten  🗪 4 Kommentare

Mit Zenity lassen sich auf einfache Art grafische Dialoge im Terminal, im Shell-Skript oder für die Erweiterung von Anwendungen erstellen.

gui-dialoge im terminal

Manchmal möchte man bei Shell-Skripten oder der Erweiterung von Anwendungen Daten in einem grafischen Dialog ausgeben oder Benutzereingaben entgegennehmen. Für GNOME-basierte Desktop Umgebungen empfiehlt sich dafür das Werkzeug Zenity, welches sehr einfach zu bedienen ist und keinen Programmieraufwand erfordert.

Zenity ist eine Neufassung von gdialog, der GNOME-Portierung von dialog, die es ermöglicht, eine Reihe von Widgets für verschiedene Operationen zu erstellen, mit denen Benutzer grafisch mit dem Skript interagieren können. Die Widgets basieren auf dem GTK-Toolkit. Das Werkzeug ist ein Open-Source-Programm, das in der Programmiersprache C geschrieben wurde. Es unterstützt Linux, BSD und Windows.

In diesem Beitrag zeige ich, wie man mit Zenity grafische GTK-Dialoge aus der Kommandozeile und Shell-Skripten heraus anzeigt.

Zenity ist in fast allen Repos enthalten und wird auf dem üblichen Weg installiert, z. B. sudo apt install zenity. Zu Beginn empfiehlt es sich im Terminal zenity --help aufzurufen, da diese Hilfeinformation bereits die halbe Miete ist. Folgende Dialoge stehen zur Verfügung:

  • calendar (Kalenderdialog anzeigen)
  • entry (Texteingabe-Dialog anzeigen)
  • error (Fehlerdialog anzeigen)
  • info (Info-Dialog anzeigen)
  • file-selection (Dateiwähler-Dialog anzeigen)
  • list (Listendialog anzeigen)
  • notification (Benachrichtigung anzeigen)
  • progress (Fortschrittsanzeige-Dialog anzeigen)
  • question (Fragedialog anzeigen)
  • warning (Warndialog anzeigen)
  • scale (Schieberegler-Dialog anzeigen)
  • text-info (Text-Informationsdialog anzeigen)
  • color-selection (Farbwahldialog anzeigen)
  • password (Passwortdialog anzeigen)
  • forms (Formulardialog anzeigen)
  • display=DISPLAY (X display to use)

Zu jedem Element (z. B. calendar) kann mit zenity --help-calender eine spezifische Hilfe aufgerufen werden. Möchte man konkrete Anwendungsbeispiele sehen, lohnt sich ein Blick in die man-Page.

Die Verwendung von Zenity läuft immer in diesen Schritten ab:

  1. Aufruf des Befehls aus dem Terminal oder einem Shell-Skript oder aus einer Anwendung
  2. Übergabe von Parametern entsprechend dem gewählten Dialog (Titel, Text, Felder, usw.)
  3. Darstellung des Dialogs
  4. Empfang und Weiterverarbeitung der Rückgabewerte

Hier ist ein Beispiel für die Verwendung des Info-Dialogs:

Dieser Aufruf liefert keine Rückgabewerte, weil es keine gibt. Anders ist das beim Kalenderdialog:

Nach dem Beenden des Dialogs mit OK, wird das gewählte Datum (31.01.2023) zurückgegeben. Bei mehreren Rückgabewerten werden diese Pipe-separiert ausgegeben. Hier ein Beispiel mit dem Form-Dialog:

Der Rückgabewert sieht so aus: Ralf|Hersel und erfordert eine Nachbearbeitung, um die Werte zu separieren. Das kann man mit dem cut Befehl erledigen:

ergebnis=$(zenity --forms --text "Ein Text" --add-entry "Vorname" --add-entry "Nachname")
echo $ergebnis
Ralf|Hersel
echo $ergebnis | cut -d "|" -f 1
Ralf
echo $ergebnis | cut -d "|" -f 2
Hersel

Damit erhält man Einzelwerte, die für die weitere Verarbeitung zur Verfügung stehen.

Quelle: https://de.wikipedia.org/wiki/Zenity

Tags

Zenity, Dialog, Widget, Eingabe, Terminal

Andi Hafner
Geschrieben von Andi Hafner am 31. Januar 2023 um 19:08

Siehe auch https://wiki.ubuntuusers.de/Zenity/ (GNOME-Desktop) sowie https://wiki.ubuntuusers.de/KDialog/ (KDE-Desktop)

John Gotti
Geschrieben von John Gotti am 31. Januar 2023 um 20:59

Cool. Wird gebookmarkt und bei Gelegenheit ausprobiert.

kamome
Geschrieben von kamome am 8. Februar 2023 um 08:47

Danke, hilfreich kann auch ein

--separator='
'

sein (Newline zwischen Single-Quotes).

fastix
Geschrieben von fastix am 9. Februar 2023 um 12:33
#!/bin/bash

SEP='
';
readarray ergebnis < <(zenity --separator="$SEP" --forms --text "Ein Text" --add-entry "Vorname" --add-entry "Nachname");

for line in "${ergebnis[@]}";do
    echo -n "$line";
done