Mit Zenity grafische Fenster erzeugen

Flattr this!

Wenn man kleinere Shellscripte schreibt, die Usereingaben verlagen, dann wäre es durchaus schön, wenn man hier grafische Fenster erzeugen könnte, die die Standard Benutzereingaben, wie Dateiauswahl, Passworteingabe etc. abfragen würden. Für GTK bzw. Gnome gibt es dafür das Programm Zenity. Mit diesem Programm (welches unter Ubuntu ggf. noch per sudo apt-get install zenity installiert werden muss) kann man Systemeigene Fenster erzeugen und die Auswahl bzw. die Eingabe des Users abfragen. In diesem Beitrag werde ich die wichtigsten Parameter und Anwendungsbeispiele vorstellen. Das KDE Äquivalent KDialog werde ich in einem anderen Artikel vorstellen, die Syntax ist jedoch ähnlich. Natürlich setze ich hier voraus, dass die Grundlagen für einfache Shellscripts vorhanden sind.
Zenity hat folgende Möglichkeiten:

Option Parameter
Information --info
Frage --question
Warnung --warning
Fehler --error
Benachrichtigung --notification
Texteingabe --entry
Versteckter Text bei Texteingabe --entry --hide-text
Dateiauswahl --file-selection
Auswahl aus einer Liste --list
Passworteingabe --password
Fortschrittsanzeige --progress
Schieberegler --scale

Eine Übersicht, über alle Funktionen erhält man durch die Eingabe von zenity --help oder über die manpage. Mit den Aufgelisteten Parametern legt man lediglich die Art des Fensters fest.
Anhand eines kleinen Installationsscriptes will ich nun einmal die Funktionsweise demonstrieren:
Zuerst erzeugen wir eine Meldung, dass das Programm bereit zur Installation ist. Dazu verwenden wir folgenden Befehl:
zenity --info --text="Das Programm ist bereit zur Installation" --title="Installationsbeginn"
hier wurde nun mit –info festgelegt, dass es sich bei der Erscheinung um ein Informationsfenster halten soll. In den „“ von –text=““ legt man den Text fest, der angezeigt werden soll. Mit title=““ definiert man den Fenstertitel des erzeugten Fensters. Diese beiden Funktionen benötigt man eigentlich bei jedem Aufruf eines Fensters mit zenity. Die Anordnung der Parameter –text und –title ist egal, solange sie hinter der Fensterart angebracht werden.
Als nächstes wollen wir den Nutzer fragen, ob er das Programm installieren möchte. Dazu verwenden wir folgende Befehlszeile:
zenity --question --text="Soll das Programm installiert werden?" --title="Installationsbeginn"
Hier erscheint nun ein Fenster, welches es dem Nutzer ermöglicht, Ja oder Nein anzuklicken. hier gillt es jetzt natürlich, die Benutzereingabe abzufragen. Dazu speichert man die Eingabe in einer Variable und überprüft diese direkt:
if ! eing=$(zenity --question --text="Soll das Programm installiert werden?" --title="Installationsbeginn"); then exit 0; fi
Hier wird jetzt Beendet, wenn der Benutzer auf Nein geklickt hat. Unsere Nächste Frage wäre jetzt, den User zu fragen, welche Datei(en) er installieren möchte. Dazu haben wir 2 Möglichkeiten:
Wir lassen den User zu einer Datei navigieren
ziel=$(zenity --file-selection --title="Dateiauswahl")
Bei dieser Auswahlmethode kann nur eine Datei (kein Ordner) ausgewählt werden. Wollen, wir das der User einen Ordner auswählen kann, gehen wir wie folgt vor:
datei=$(ls | zenity --list --title="Dateiauswahl" --column="Installationsdatei")
Hier werden nun in einer Liste alle Dateien und Ordner des aktuellen Verzeichnisses aufgelistet und der Benutzer kann die Datei oder den Ordner hier auswählen.
Als nächstes wollen wir den Benutzer fragen, unter welchem Namen er das Programm installieren will. Dazu verwenden wir die Eingabemethode wie folgt:
name=$(zenity --entry --text="Programmname" --title="Programmname")
Die Eingabe des Nutzers wird hier erst in die Variable geschrieben, wenn er auf Ok klickt. Generell steht in den Variablen 1 für das drücken der Abbrechen Taste oder einen Klick auf den schließen Button. Eine 0 steht für einen Klick auf OK (Zum Beispiel bei –info). Und eine 5 ist der Rückgabewert für eine Zeitüberschreitung.
Um die Installation des Programms fortzusetzen, muss nun natürlich das Passwort abgefragt werden. Hier wollen wir jedoch nicht, dass dieses im Klartext zu sehen ist. Auch hierfür haben wir 2 Möglichkeiten:
Entweder wir verbergen die Eingabe durch
passwd=$(zenity --entry --hide-text --text="Passwort" --title="Passworteingabe")
oder aber wir verwenden direkt das Parameter --password:
passwd=$(zenity --password --text="Passwort" --title="Passworteingabe")
Um das Passwort direkt an den Befehl sudo zu übergeben und danach aus der Variable zu löschen, geht man am Besten so vor:
passwd=$(zenity --password --text="Passwort" --title="Passworteingabe"); echo -e "$passwd\n" | sudo -s -k -S Befehl; passwd="";
Das Paramet -k setzt hier das Passwort sofort wieder zurück und speichert es nicht (wie bei dem befehl sudo eigentlich üblich) für ein paar Minuten.
In unserer nun gestarteten Installation wollen wir natürlich einen Fortschrittsbalken anzeigen lassen. Dieser lässt sich auf einfachen Schritten natürlich nicht realistisch prozentual anpassen. Es empfiehlt sich aber zum Beispiel in unserem Fall die Befehle für die Installation zu zählen und dann entsprechende Etappen bis zu 100% festzulegen.
var=10; ( for var in 10 20 30 40 50 60 70 80 90 100; do echo $var; sleep 1; done ) | zenity --progress --text="Erfasse Dateien" --title="Installation" --percentage=0
Dieses Beispiel geht jede Sekunde um 10 Prozent weiter. Im Anwendungsfall würde man mithilfe der for – Schleife entsprechende Befehle ausführen lassen. Alternativ kann man natürlich auch so vorgehen:
( var=10; while [ $var -lt 101 ]; do echo $var; var=$(($var+10)); sleep 1; done ) | zenity --progress --text="irgendwasmachsternchen" --title="wasmach" --percentage=0
Zu guter Letzt machen wir unseren Benutzer darauf aufmerksam, dass eine Datei nicht übertragen werden konnte:
zenity --error --text="Eine Datei konnte nicht übertragen werden" --title="Übertragungsfehler"
Und dazu lassen wir eine Systembenachrichtigung anzeigen,die die Installation als unvollständig beendet erklärt.
zenity --error --text="Eine Datei konnte nicht übertragen werden" --title="Übertragungsfehler" & zenity --notification --text="Die Installation konnte nicht Ordnungsgemäß beendet werden" --title="Fehler bei der Installation"
Und nun beenden wir die Installation mit einer entsprechenden Warnung:
zenity --warning --text="Die Installation war nicht erfolgreich" --title="Fehlerhafte Installation" Mit diesem nutzlosen Script hoffe ich, dass die Verwendung von zenity klar wurde. Es ist definitiv immer wieder praktisch, darauf zurückgreifen zu können.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.