Wer kleine Skripte schreibt und nutzt, möchte Rückmeldungen oder Fragen des PCs in manchen Fällen auch optisch aufpeppen. Benutzerabfragen in einem eigenen Dialog anzuzeigen, wäre da ein erster Schritt. Für GNOME bzw. GTK-Dialoge gibt es dafür das Programm
zenity
was über gleichnamiges Paket installiert [1] werden kann.
Anhand eines kleines Skriptes sollen die Möglichkeiten des Programms aufgezeigt werden.
Das Beispielskript ist recht simpel aufgebaut: Es soll zuerst eine Warnung zum Programm angezeigt werden, dann wird vom Benutzer eine Texteingabe und eine Passworteingabe gefordert und alles am Ende wieder angezeigt. Die Quellcodezeilen sind nummeriert, um sie später besser erklären zu können.
Zuvor ein paar allgemeine Informationen zur Shell-Programmierung: In der Regel reicht es in der ersten Zeile die Standardshell unter /bin/sh zu benutzen. Die if-then-Konstrukte werden benutzt, um festzustellen, ob der Benutzer auf "Abbrechen" bzw. "Nein" geklickt hat. Der Befehl "exit" beendet in so einem Fall das Skript. Ein "\n" in einer Textzeile sorgt für einen Zeilenumbruch. Die Variablenzuweisung mit "=" kann später per "$" wieder ausgelesen werden.
Damit die Skripte starten, muss man diese nach dem Speichern natürlich noch ausführbar machen [3].
Folgendes Script gibt man (ohne Zeilennummern) in einem Editor [2] ein und speichert es an einen beliebigen Ort:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #!/bin/bash if ! zenity --warning --text "Dieses Programm ist eigentlich harmlos!\nTrotzdem fortfahren?"; then exit; fi if ! NAME=$(zenity --entry --text "Bitte geben Sie Ihren Namen ein:" --title "Wer sind Sie?"); then exit; fi if ! PASS=$(zenity --entry --hide-text --text "Bitte geben Sie das Passwort ein:" --title "Und das Passwort?"); then exit; fi ( echo "25"; sleep 1 echo "# Statusmeldung 1" echo "50"; sleep 1 echo "# Statusmeldung 2" echo "100" ) | zenity --progress --text "Vorgang wird bearbeitet" --percentage=0 zenity --info --text "Ihr Name: $NAME\nIhr Passwort: $PASS" --title "Das Ergebnis!" |
Zeile 3: Die Option --warning zeigt eine Warnung mit den Optionen "Ok" und "Abbrechen" an. Den angezeigten Text kann man immer mit der Option --text beeinflussen.
Zeile 7: Die Option --entry zeigt ein Texteingabefeld mit den Optionen "Ok" und "Abbrechen" an.
Zeile 11: Dies zeigt wieder ein Texteingabefeld, die Option --hide-text verschlüsselt dabei aber die Eingabe durch Sternchen.
Zeilen 15-21: Es wird ein Fortschrittsbalken mit Startwert 0% angezeigt, dessen Prozentzahl wird in 25er Schritten hochgezählt und der Anzeigetext "Statusmeldung X" bei jedem Schritt verändert.
Zeile 23: Am Ende wird per --info ein Informationsfenster mit den eingegebenen Daten angezeigt.

| Option | Aktion |
| --info | Information |
| --warning | Warnung |
| --error | Fehler |
| --question | Frage |
| --notification | Benachrichtungsfeld |
| --entry | Texteingabe |
| --file-selection | Dateiauswahl |
| --list | Listenauswahl |
| --progress | Fortschrittsanzeige |
| --scale | Schieberegler |
| --entry --hide-text | Passwort |
| --calendar | Kalender |
Dies ist natürlich nur ein Teil von dem, was Zenity kann. Genaueres erfährt man im Terminal per
zenity --help
oder in der Manpage zu Zenity.
Öfters möchte man mit einem simplen Skript zwei gegenteilige Aktionen ausführen, z.B. ein Programm starten und beenden oder sich ins Internet ein- und wieder auswählen. Eine Lösungsmöglichkeit wären zwei getrennte Skripte, die das erledigen. Aus Platzgründen wäre es aber komfortabler dies mit einem einzigen Icon (welches sich je nach Status verändert) im Panel zu erreichen.
Das Skript wird in einem Editor [2] erstellt. Hier fügt man das Grundgerüst ein:
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash while(true) do zenity --notification --window-icon=$HOME/.icons/status1.png # Befehl 1 zenity --notification --window-icon=$HOME/.icons/status2.png # Befehl 2 done |
Danach muss das Skript ausführbar gemacht werden [3].
Das Skript ist nichts anderes als eine Endlosschleife, die zwischen zwei Stadien hin- und herschaltet. Zuerst wird zenity aufgerufen und präsentiert im Benachrichtigungsfeld des Panels das Icon status1.png. Klickt man auf dieses, wird Befehl 1 ausgeführt und sofort wieder zenity gestartet, dieses mal aber mit status2.png als Bild. Klickt man wieder darauf, wird Befehl 2 abgearbeitet und die Schleife fängt von vorne an. Dies stellt einen simplen Umschalter dar.
Anstelle der beiden Kommentare muss man die Befehle (es sind natürlich auch mehrere Zeilen möglich) einfügen, die abgearbeitet werden sollen.
Die Icons werden im versteckten Ordner .icons gespeichert. Die Wahl ist dabei willkürlich und kann nach Belieben geändert werden. In der Regel existiert der Ordner aber sowieso (falls man spezielle Icon-Themes installiert hat) und stört nicht einmal die Übersicht, da er versteckt ist.
Sinnvolle Icons sind z.B. simple rote und grüne Buttons:

Eine sehr gute Anwendung findet man, wenn man sich ins Internet einwählen möchte. Nicht jeder Benutzer möchte DSL sofort beim PC-Start laufen lassen, für ISDN-Benutzer kommt dies sowieso nicht in Frage. Voraussetzung ist, dass die Internetverbindung mit "pppoeconf" eingerichtet wurde und die automatische Einwahl natürlich nicht aktiviert ist. Der Provider heißt hier dsl-provider und muss ggf. angepasst werden.
Als Icons kann man die zwei Netzwerk-Bilder aus Ubuntu nehmen:

Nach dem Speichern beider Bilder im .icons-Ordner lautet das Skript dann:
1 2 3 4 5 6 7 8 | #!/bin/bash while(true) do zenity --notification --window-icon=$HOME/.icons/dsl_stat_off.png pon dsl-provider zenity --notification --window-icon=$HOME/.icons/dsl_stat_on.png poff -a done |
Dieses dann z.B. als dsl-dial.sh speichern, ausführbar machen und im Autostart eintragen.
Das Benachrichtigungsfeld kann auch über einen Dateideskriptor angesteuert werden. Damit Zenity auf Eingaben wartet, muss die Option --listen gesetzt weden. Dadurch kann man den Status einer längerdauernden Aktion, z.B. Herunter-/Hochladen von größeren Datenmengen oder das Konvertieren vieler Dateien, fortlaufend aktualisieren.
Das Skript wird in einem Editor [2] erstellt. Hier fügt man das Grundgerüst ein:
1 2 3 4 5 6 7 8 9 10 11 12 | #!/bin/bash exec 3> >(zenity --notification --listen) for datei in $(ls $1) do echo "tooltip:Aktionen für ${datei} werden durchgeführt" >&3 #Befehle für aktuelle Datei abarbeiten done echo "message:Vorgang abgeschlossen" >&3 exec 3>&- |
Zeile 2: Hier wird der Dateideskriptor 3 geöffnet und Zenity gestartet. Es kann auch ein anderer Dateideskriptor >=3 verwendet werden.
Zeilen 4-8: Für alle Dateien im Verzeichnis $1 werden die entsprechenden Befehle abgearbeitet. Zeile 7 muss natürlich durch die jeweiligen echten Befehle ersetzt werden.
Zeile 6: Der Tooltip für das Icon wird bei jedem Durchgang aktualisiert.
Zeile 10: Es wird eine Sprechblase unter dem Benachrichtigungsicon angezeigt.
Zeile 12: Der Dateideskriptor wird geschlossen und Zenity beendet.
Das Benachrichtigungsicon lässt sich über folgende Kommandos steuern. Das Format ist immer
<Kommando>:<Wert>
| Option | Aktion |
| icon | Das anzuzeigende Icon. Als Wert gibt man den Pfad zum jeweiligen Icon an. |
| visible | Soll das Icon angezeigt werden? Mögliche Werte sind true und false |
| tooltip | Text des Tooltips |
| message | Eine Sprechblase wird unterhalb des Icons angezeigt. Der anzuzeigende Text wird als Wert erwartet. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash exec 3> >(zenity --progress --title="Sicherung" --percentage=0 --auto-close --width=400) echo "# Ermittle Dateien..." >&3 count=$(find ${1-.} | wc -l) # Anzahl der Dateien IFS=' ' # wegen Dateien mit Leerzeichen i=0 for file in $(find ${1-.}) do i=$(($i+1)); echo $(($i*100/$count)) >&3; if [ -d $file ]; then continue; fi #Verzeichnisse überspringen echo "# Datei '$file' wird gesichert..." >&3; echo "Datei '$file' wird gesichert..."; # hier das einsetzen was mit der Datei gemacht werden soll. done echo Fertig. exec 3>&- |
Zenity wird geöffnet (Bedeutung der Optionen siehe Manpage)
find ${1-.} | wc -l: Die Anzahl der Dateien wird ermittelt, wegen der Fortschrittsanzeige und das Ergebnis $count zugewiesen
In einer Schleife werden alle Dateien durchgearbeitet ($IFS bestimmt, an welchen Zeichen eine neue Datei beginnt)
$(($i*100/$count)): Errechnung der Prozentzahl
echo "# Datei '$file' wird gesichert..." >&3;: Zahlen werden von Zenity als Prozentsatz interpretiert, "# Text" bestimmt den Anzeigetext
Unter Intrepid Ibex 8.10 in Zenity-Version 2.24.0 öffnen sich die Zenity-Fenster aufgrund eines Bugs im Hintergrund. Zur Behebung existiert ein Patch
und ein 272083 Bugreport mit Informationen (auch bei Gnome
und Redhat
). Ab Jaunty Jackalope 9.04 sollte der Fehler nicht mehr auftreten.
Den Patch in einen Editor[2] kopieren, und unter zenity-2.24.0-focus.patch abspeichern. Das Einspielen geht so (Pfad zum Patch an den tatsächlichen Ablageort anpassen):
patch -p0 /usr/share/zenity/zenity.glade < /pfad/zum/patch/zenity-2.24.0-focus.patch
In Karmic ist der Patch nicht mehr nötig (und das angegebene Vorgehen funktioniert dort auch nicht).
Diese Revision wurde am 19. Juni 2010 um 17:30 Uhr
von Markus Mustermann erstellt.
Dieser Seite wurden folgende Begriffe zugeordnet:
GNOME, System, Programmierung
2004 – 2010 ubuntuusers.de • Einige Rechte vorbehalten