Zenity

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche


Dieser Artikel ist Teil der HOWTO Sammlung

zenity ermöglicht die Darstellungen von GTK+ Dialogen aus einfachen Shell-Scripts heraus. Es ist eine simplere Alternative zu Perl und Python, welche diese Module zum Erzeugen von GUI-Elemente auch beinhalten.

Inhaltsverzeichnis

Installation

Die Installation von zenity ist sehr einfach, da es im Repository von Core verfügbar ist. Entweder mit Yum, pirut oder yumex installieren.

[root]# yum install zenity


Die Elemente

zenity besitzt nur einen beschränkten Funktionsumfang, jedoch ist dieser ausreichend, um alle wichtigen Dialog-Boxen zu erzeugen.

Mitteilungsdialoge

Die einfachste Form einer Hinweis-Box kann den Benutzer informieren oder ihn über den Status unterrichten.

zenity --info --text "Dies ist eine Hinweis-Box"

Die Option --text ="STRING" kann bei allen Typen verwendet werden und wird nicht mehr aufgeführt.

Allgemeine Optionen für die Dialogbox-Typen
Option Beschreibung
--title=TITLE legt den Dialog-Titel fest
--window-icon=ICONPATH Legt das Icon des Dialoges fest
--width=WIDTH Gibt die Dialogfenster-Breite an
--height=HEIGHT Gibt die Dialogfenster-Höhe an

Mitteilungs-Dialog für Text

Soll eine grössere Anzahl von Zeichen, zum Beispiel der Inhalt einer Datei, ausgegeben werden, kann dieser Dialog-Typ verwendet werden.

zenity --text-info --text "Dies ist eine Mitteilungs-Box für viel Text"

Frage-Dialoge

Die Frage-Dialoge können entweder mit ja oder nein beantwortet werden. Sie geben je nach Antwort 0 oder 1 zurück. Mit dieser Information kann weitergearbeitet werden.

zenity --question --text="Sind Sie sicher?"

Eingabe-Dialoge

Diese Dialog-Art unterscheidet sich insofern von den anderen, dass sie Informationen speichern muss, respektive an eine Variabel übergeben.

Soll der Wert in das Terminal übertragen werden.

zenity --entry --title=Name --text="Bitte Namen eingeben" || NAME

Hier wird der eingegebene Wert in ein Variabel gespeichert.

WERT=`zenity --entry --title=Name --text="Bitte Namen eingeben"`

Der Wert kann auch in eine Datei geschrieben werden. Bei der Verwendung von > wird die Datei erzeugt und der Wert hineingeschrieben, falls die Datei existiert, wird sie überschrieben. Wird >> gebraucht, wird der Wert am Ende der Datei angehängt.

tmpfile=/tmp/log_name.$$
zenity --entry --title=Name --text="Bitte Namen eingeben" >> $tmpfile

Warn-Dialoge

Diese Dialoge sind wie der Mitteilungs-Dialog, nur, dass sie bereits ein entsprechendes Icon enthalten.

zenity --warning --text "Dies ist eine Warn-Box" --title=Warn-Box

Fehler-Meldung

Analog zum Warn-Dialog

zenity --error --text "Dies ist eine Fehler-Dialog-Box" --title=Fehler-Hinweis

Kalender-Dialog

Mit diesem Dialog ist es möglich mit dem Datum zu arbeiten. Es wird eine Monats-Übersicht angezeigt.

zenity --calendar --text "Dies ist ein Kalender" --title="Kalender"

Neben den allgemeinen Optionen, gibt es für diesen Typen folgende zusätzliche Optionen.

Spezielle Optionen für diesen Dialogbox-Typen
Option Beschreibung
--day=INT Setzt den Kalender-Tag
--month=INT Setzt den Kalender-Monat
--year=INT Setzt das Kalender-Jahr
--date-format=STRING Datum-Format

Liste

Für die strukturierte Darstellung von Daten ist der Listen-Dialog eine bequeme Methode, da man sich nicht mit der Formatierung herumschlagen muss.

zenity --list --text "Dies ist eine Fehler-Dialog-Box" --title=Auswahl-Liste

Neben den allgemeinen Optionen, gibt es für diesen Typen folgendes zusätzliche Optionen

Spezielle Optionen für diesen Dialogbox-Typen
Option Beschreibung
--column=STRING Spalten-Kopf
--checklist In der ersten Spalte hat es Check-Boxen
--radiolist Radio-Knöpfe in der ersten Spalte
--separator=STRING Ausgabe-Trennzeichen
--editable Lässt Änderungen am Text zu
--print-column=STRING Legt die Spalte fest, welche als als Standard-Ausgabe verwendet wird. Standardmässig ist es die erste Spalte. "ALL" benützt alle Spalten.

Datei-Auswahl

Für die Auswahl von Dateien gibt es eine speziellen Dialog-Typ. Dieser stellt die gewünschte Funktion zur Verfügung.

zenity --file-selection --text "Dies ist eine Datei-Auswahl-Dialog-Box" --title=Datei-Auswahl

Neben den allgemeinen Optionen, gibt es für diesen Typen folgendes zusätzliche Optionen

Spezielle Optionen für diesen Dialogbox-Typen
Option Beschreibung
--filename=FILENAME Setzt den Dateinamen
--multiple Lässt mehrfache Auswahl zu
--separator=SEPARATOR Trennzeichen bei der Wahl bei mehreren Dateien

Progress-Status

Bei länger dauernden Prozessen ist es für den Benutzer praktisch, wenn angezeigt wird, wie der Status der Operation ist, respektive wie lange es noch dauert, bis das Ende erreicht ist.

zenity --progress --text "Dies ist ein Progress-bar" --title=Progress-Bar

Neben den allgemeinen Optionen, gibt es für diesen Typen folgendes zusätzliche Optionen

Spezielle Optionen für diesen Dialogbox-Typen
Option Beschreibung
--percentage=INT Legt Start-Prozentsatz fest
--auto-close Schliesst automatisch bei 100%
--pulsate Progress-Bar pulsisert

Muster

In der folgenden Tabelle werden ein paar Beispiele zur Veranschaulichung der Dialogboxen mit ihrem Code aufgelistet.

Dialog-Boxen
Einfachste Hinweisbox
Einfache Version ohen Titel
Einfache Version ohen Titel
zenity --info --text "Dies ist eine Hinweis-Box"
Einfache Version mit Titel
Einfache Version mit Titel
Einfache Version mit Titel
zenity --info --text "Dies ist eine Hinweis-Box" --title=Hinweis-Box
Einfache Version mit Titel und mehr Text
Einfache Version mit Titel und spezieller Grösse
Einfache Version mit Titel und spezieller Grösse
zenity --info --text "zenity --info --text "Dies ist eine Hinweis-Box \
 Diese Box enthält mehr Text. Als die vorherigen Versionen \
 Und noch etwas mehr..." --title=Hinweis-Box
Eingabe-Feld
Eingabe-Aufforderung
Eingabe-Aufforderung
zenity --entry --title=Name --text="Bitte Namen eingeben" || NAME
Frage-Dialog
Abfrage
Abfrage
zenity --question --text="Sind Sie sicher?"
Liste
Auswahl-Liste
Auswahl-Liste
zenity --list --radiolist --width=500 --height=250 --text "Welche Tageszeit ist momentan?" --title "Tageszeit-Auswahl" --column="" --column Punkt --column Beschreibung \
\"\" Morgen			"Es ist Morgen" \
\"\" Mittag			"Es ist Mittag" \
\"\" Abend			"Es ist Abend" \
Kalender
Kalender
Kalender
zenity --calendar \
        --title="Wähle ein Datum" \
        --text="Klicke auf ein Datum um es zu wählen" \
        --day=28 --month=2 --year=2007


Programm-Beispiele

Folgende Beispiele sollen einen Einblick das Verwenden von zenity in Shell-Skripten bieten und auch als Anregung zum Erstellen von eigenen Programmen dienen. Es ist keine Abhandlung über die Shell-Programmierung und sollte so auch von weniger versierten Anwendern verstanden werden. Ich habe versucht alle relevante Teile ausführlich zu kommentieren. Viele nützliche Informationen über die Skript-Programmierung in der Shell können diesem Howto oder dieser Anleitung entnommen werden und wurden auch hier verwendet.

Zum Ausführen der Skripte, nachdem der Inhalt in eine Datei kopiert worden ist, siehe unter "Ausführen der Programme" in nächsten Kapitel.

Hallo Welt

Das bekannteste, erste Programm sollte natürlich nicht ausgelassen werden. In einer etwas anderen Form, da zenity ja nicht wirklich eine Programmiersprache ist, sondern nur auf die Shell-Programmierung aufsetzt. Ein Shell-Skript für "Hallo Welt" sieht so aus.

#! /bin/bash
#          
echo Hallo Welt ! 

Ein bisschen erweitert, es wird nun eine Variabel benutzt. Als keine Anmerkung sei gesagt, dass die Variabelnamen nur alphanummerische Zeichen und Unterstrich enthalten dürfen.

#! /bin/bash
#
VAR="Hallo Welt"
zenity --info --title=$VAR --text="$VAR"

Die Entsprechung auf Shell-Basis würde nun so aussehen.

#! /bin/bash
#         
VAR="Hallo Welt"
echo $VAR

Angemeldeter Benutzer

Im vorherigen Beispiel wurde VAR als Variabel benutzt. Es gibt jedoch auch Variabeln, welche das System für sich verwendet. Eine dieser Variabeln ist $USER und zeigt den angemeldeten Benutzer an.

#! /bin/bash
#         
echo "Hallo $USER"
exit 0

Nun die Variante mit zenity

#! /bin/bash
#
zenity --info --title=Benutzer --text="Hallo $USER"
exit 0

Anlegen von einem Verzeichnis

Die erste Variante ist ein reines Shell-Skript. Es wird im Verzeichnis /tmp ein neues Verzeichnis verzeichnis01 angelegt.

Eine kurze Fassung sieht so aus

#! /bin/bash
#
# Pfad zum temprären Verzeichnis und den Namen des Verzeichnisses festlegen
TMPDIR=/tmp/
VERZ_NAME=verzeichnis01

# Ein eventuell vorhandenes Verzeichnis wird gelöscht
rm -rf $TMPDIR/$VERZ_NAME

# Anlegen des Verzeichnisses $VERZ_NAME
mkdir -p $TMPDIR/$VERZ_NAME

Die leicht erweiterte Version, welche eine einfache Integration von zenity ermöglicht.

#! /bin/bash
#
# Pfad zum temprären Verzeichnis und den Namen des Verzeichnisses festlegen
TMPDIR=/tmp/
VERZ_NAME=verzeichnis01
############################### Programm-Bereich ###############################

function verz_anlegen {

# Ein eventuell vorhandenes Verzeichnis wird gelöscht
rm -rf $TMPDIR/VERZ_NAME

# Anlegen des Verzeichnisses $VERZ_NAME
mkdir -p $TMPDIR/$VERZ_NAME

}
##############################################################
# Der Programm-Start

verz_anlegen

Nun soll der Verzeichnis-Name vom Benutzer gewählt werden können. Im vorherigen Beispiel war der Verzeichnis-Name "hardcodiert".

#! /bin/bash
#
# Pfad zum temprären Verzeichnis
TMPDIR=/tmp/
############################### Programm-Bereich ###############################

function verz_anlegen {

# Dialog-Box zur Verzeichnis-Namen-Eingabe
VERZ_NAME=`zenity --entry --title=Ping --text="Verzeichnis-Name"`

# Ein eventuell vorhandenes Verzeichnis wird gelöscht
rm -rf $TMPDIR/$VERZ_NAME

# Anlegen des Verzeichnisses $VERZ_NAME
mkdir -p $TMPDIR/$VERZ_NAME

}
##############################################################
# Der Programm-Start

verz_anlegen

In diesem Beispiel wurde nun mit einem Funktionsaufruf gearbeitet. Dies ermöglicht die einfache Wiederverwendung von Code-Segmenten, da sich die relevanten Teile innerhalb der geschweiften Klammern befindet. Der Aufruf der Funktion erfolgt mit verz_anlegen, welche ganz am Ende des Skriptes steht. Dies ist nur eine Möglichkeit, um den Code besser zu gliedern.

Anlegen einer Datei

Hier wird mit touch eine Datei angelegt, nachdem man als Benutzer das Verzeichnis eingegeben hat.

#! /bin/bash
#
############################### Programm-Bereich #################################################

function anlegen {

# Dialog-Box zur Verzeichnis-Namen-Eingabe

PFAD=`zenity --entry --title=Dateien anlegen --text="Angabe des Verzeichnises, inkl. aller /"`

# Abfrage: je nach Antwort wird 0 oder 1 zurückgegeben.
zenity --question --text="Sind Sie sicher?"

if [ $? = 0 ];then
	# Anlegen einer Datei
	touch $PFADTest.$$ || exit 1
else 
	zenity --info --text "Danke für die Benutzung"
	exit 1

fi

}

##############################################################################################
# Start

anlegen

Löschen von Dateien

Teile des obigen Skriptes können auch verwendet werden zum Löschen von Dateien. Wir entnehmen nur den rm -rf-Teil. Weitere Informationen zu rm -rf gibt es hier.

Achtung Achtung: Bei der Verwendung diese Beispiel sollte man genau wissen, was man macht.
#! /bin/bash
#
############################### Programm-Bereich ###############################

function loeschen {

# Dialog-Box zur Verzeichnis-Namen-Eingabe
PFAD=`zenity --entry --title=Verzeichnis--text="Angabe des Verzeichnis, inkl. aller /"`

# Abfrage: je nach Antwort wird 0 oder 1 zurückgegeben.

zenity --question --text="Sind Sie sicher?"

	if [ $? = 0 ];then
		# Eventuell vorhandene Dateien werden gelöscht
		rm -rf $PFAD/* || exit 1
	else 
		zenity --info --text "Danke für die Benutzung"
		exit 1

	fi
}
##############################################################
# Der Programm-Start

loeschen

Hier wurde nun, wie auch schon bei Beispiel zum Anlegen einer Datei, mit eine Schlaufe gearbeitet. So ist die Auswertung des Frage-Dialoges sehr einfach.

Erweiterung der Auswahl-Liste

Wir führen das Beispiel aus der obigen Muster-Liste fort. Die Auswahl-Liste lässt dem Benutzer die Wahl zwischen drei Zuständen.

#! /bin/bash
#
############################### Auswahlmenü #################################################

function menu {

AUSWAHL=`zenity --list --radiolist --width=700 --height=350 --text "Welche Tageszeit ist momentan?" --title "Tageszeit" --column="" --column Punkt --column Beschreibung \
\"\" Morgen			"Es ist Morgen" \
\"\" Mittag			"Es ist Mittag" \
\"\" Abend			"Es ist Abend" \
`

# Auswerten der Auswahl

if [ -z "$AUSWAHL" ];then
	zenity --info --text "Danke für die Benutzung"
elif [ "$AUSWAHL" = Morgen ];then
	auswahl_morgen
elif [ "$AUSWAHL" = Mittag ];then
	auswahl_mittag
elif [ "$AUSWAHL" = Abend ];then
	auswahl_abend
fi

}

############################### Morgen #############################

function auswahl_morgen {

# Infotext
zenity --info --text "Es ist Morgen"

menu

}

############################### Mittag #############################

function auswahl_mittag {

zenity --info --text "Es ist Mittag"

menu

}

############################### Abend ###############################

function auswahl_abend {

zenity --info --text "Es ist Abend"

menu

}

##############################################################################################
# Start

menu 

Darstellen von Ausgabe-Werten

Dieses Beispiel stammt aus der Man-Page von zenity und zeigt die Funktionsweise, wie Daten eleganter dargestellt werden können. Hier wird der Inhalt des aktuellen Verzeichnis angezeigt.

#! /bin/bash
#
############################### Programm-Bereich #################################################

function ausgabe {

find . -name '*' | zenity --list  --width=700 --height=500 \
	--title "Such-Resultat" --text "Anzeigen der Datein im aktuellen Verzeichnis..." \
	--column "Informationen"

}

##############################################################################################
# Start

ausgabe

Darstellen der dmesg-Ausgabe

Das obige Beispiel kann ein wenig erweitert werden und so lässt sich die Ausgabe von dmesg nach einen bestimmten Begriff durchsuchen. Die Ausgabe wird in einer Liste dargestellt.

#! /bin/bash
#
############################### Programm-Bereich #################################################

function ausgabe {

# Dialog-Box zur Eingabe des Wertes
WERT=`zenity --entry --title=dmesg --text="Eingabe der Suchbegriffes"`

dmesg | grep $WERT | zenity --list  --width=700 --height=500 \
	--title "Ausgabe" --text "Anzeigen der dmesg-Ausgabe" --column "Informationen"

}

##############################################################################################
# Start

ausgabe

Durchsuchen mit Progress-Bar

Dieses Beispiel stammt ebenfalls aus der Man-Page und zeigt einen Progress-Bar an, während im Home-Verzeichnis nach Dateien gesucht wird.

#! /bin/bash
#
############################### Programm-Bereich #################################################

function suchen {

`echo $HOME` '*.pdf' | zenity --progress --pulsate  

}

##############################################################################################
# Start

suchen

Datum-Auswahl

Das Datum wird vom Befehl date geliefert und in den Variabel gespeichert. So ist das angezeigte Datum der aktuelle Tag.

#! /bin/bash
#
############################### Programm-Bereich #################################################

function kalender {

TAG=`date '+%d'`
MONAT=`date '+%m'` 
JAHR=`date '+%Y'`

if DATUM=`zenity --calendar \
        --title="Wähle ein Datum" \
        --text="Klicke auf ein Datum um es zu wählen." \
        --day=$TAG --month=$MONAT --year=$JAHR`
          then zenity --info --text "Es wurde $DATUM gewählt."
		exit 1
          else zenity --info --text "Kein Datum gewählt"
		exit 1
        fi

}

##############################################################################################
# Start

kalender


Ausführen der Programme

Wie jedes Skript, muss die Datei ausführbar gemacht werden.

chmod +x zenity-test.sh

Nun kann das Skript gestartet werden

bash zenity-test.sh

oder mit folgendem Syntax

./zenity-test.sh


Gnome-Menu

Wenn Skripte ohne öffnen eines Terminals gestartet werden sollen, brauchen sie einen Eintrag im Gnome-Menu. Dazu muss eine Datei in folgendem Verzeichnis /usr/share/applications/zenity-test.desktop angelegt werden. Der Inhalt muss dem folgendem Schema entsprechen.

[Desktop Entry]
Encoding=UTF-8
Name=Zenity Test
Comment=Testen der Zenity-Funktion
Exec=zenity-test.sh
Icon=pup.png
Terminal=true
Type=Application
Categories=System;

Weitere Informationen siehe unter Gnome Menüs editieren


Weitere Beispiele


Siehe auch

Persönliche Werkzeuge