Development/Tutorials/Shell Scripting with KDE Dialogs (de)

From KDE TechBase

Einleitung und Ausblick

Es gibt einige Missverständnisse, dass KDE nur eine grafische Umgebung sei. Richtig ist, dass KDE eine eigenständige Desktopumgebung ist, doch das Unix-Erbe der Befehlszeile und die Skriptfunktionen werden sehr wohl von KDE unterstützt. KDE Applikationen können von der Befehlszeile aus kontrolliert werden und Shellskripte können Gebrauch von KDE Elementen machen.

Für dieses Tutorial brauchen Sie ein wenig Basiswissen im Umgang mit der Befehlszeile und vom Shellskripting. Für effektives Shellskripting benötigen Sie solides Wissen über die Umgebung, doch das ist bei jeder Programmiersprache so. Wie auch immer, sie sollten in der Lage sein, den Sinn der Beispiele zu verstehen. Wenn sie fundiertes Wissen in Shellskripting haben werden Sie schnell die Schattenseite dieses Tutorials erkennen, denn einige Beispiele erscheinen redundant.

Dieses Tutorial setzt voraus, dass Sie die GNU bash shell benutzen oder etwas direkt kompatibles. Benutzer anderer Shells (speziell csh und Varianen) müssen die Beispiele vielleicht etwas ändern damit sie funktionieren.

Technik und Gebrauch von Shell Skripten variieren sehr stark. Manches Skript ist nur gedacht um vom System gestartet zu werden (z.B. cron job), andere jedoch sind richtige Programme, die vom normalen Benutzer verwendet werden. KDE bietet Funktionen die es Ihnen erlauben, einiges der KDE-Funktionalität in Shell-Skripten zu nutzen. Die kann Ihnen einiges an Arbeit ersparen und lässt Ihr Skript integriert wirken.

Als Beispiel denken Sie sich einen Passwortdialog. Wenn Sie eine Passworteingabe des Benutzer brauchen, können Sie sehr einfach einen Dialog aus Ihrem Skript heraus starten, der wie unten dargestellt erscheint.

Abb 1. Passwortdialog-Beispiel

Benutzung von kdialog

Der Schlüssel um die KDE Dialoge in Shell Skripten zu nutzen ist eine Anwendung namens kdialog. Um einen Passwort Dialog zu generieren, wie ihn Abb.1 in SektionEinleitung und Ausblick zeigt, nutzen sie die folgende Befehlszeile.

Beispiel 1. Passwortdialog

kdialog --password "Bitte geben Sie den Zugangscode des Servers ein:"

Lassen Sie uns den Code in Beispiel 1 etwas genauer anschauen. Die Argumente beim Aufruf von kdialog werden benutzt, um den Typ des Dialoges und dessen Parameter festzulegen. Im Falle des Passwortdialoges benutzen Sie--password, um den Typ festzulegen, und danach den Parameter, welcher den darzustellenden Text übergibt.

Jedesmal, wenn Sie kdialog (oder ein anderes Programm) aufrufen, erhalten Sie einen Rückgabewert. Dieser teilt Ihnen mit, ob das Programm korrekt arbeitete oder einen Fehler hatte. Sie können auf den Rückgabewert mit Hilfe der $?-Variablen zugreifen, wie das folgende Beispiel zeigt.

Beispiel 2. Rückgabewert eines Shellskripts

[bradh@rachel bradh]$ kdialog --password "Some Text"
hello
[bradh@rachel bradh]$ echo $?
0

Note

Die $? Variable wird aktualisiert, wenn ein Vordergrundprozess existiert. Wenn sie die Variable später benötigen, müssen Sie sie sichern.

In diesem Beispiel ist der Rückgabewert 0. Er wäre 1, wenn der Cancel Button anstelle des OK Buttons gedrückt worden wäre. Die Konvention ist, dass negative Zahlen einen Fehler anzeigen, die shell subtrahiert den Wert jedoch von 256. Dies bedeutet: wenn Sie vergessen, ein benötigtes Argument anzugeben, ist der Rückgabewert -2 und $? gibt 254 zurück.

Note

Dies unterscheidet sich von den darunterliegenden Elementen. Wenn Sie mit darunterliegenden Qt-Elementen vertraut sind, könnte das etwas verwirrend sein, doch dies ist wichtig, um mit dem Standard des Shellskriptings konform zu sein.

Beispiel 3. Shellskript Rückgabewert mit Fehler

[bradh@rachel bradh]$ kdialog --password
kdialog: '<text>' missing.
kdialog: Benutzen Sie --help um eine Liste der verfügbaren Optionen anzuzeigen.
[bradh@rachel bradh]$ echo $?
254

In einem Shellskript ist es von Vorteil, den Rückgabewert nach jedem Aufruf zu prüfen.

Beispiel 4. Passwort Dialog, mit Prüfung des Rückgabewertes

kdialog --password "Bitte den Zugangscode für den Server eingeben:"
    if [ $? = 0 ]; then
	    echo " Sie wählten: OK"
    else
	    echo " Sie wählten: Abbrechen"
    fi

Zusätzlich zum Rückgabewert erhalten Sie auch das Passwort (vorausgesetzt, Sie haben OK ausgewählt). Beim Passwort Dialog und allen anderen kdialog Dialogen mit Eingabemöglichkeiten wird das Ergebnis auf der Standardausgabe zurückgegeben. Dies gibt Ihnen die Möglichkeit, die Ausgabe in eine Datei umzulenken oder an ein anderes Programm weiterzugeben. In unserem Fall mit dem Passwortdialog wird der eingegebene Text als Echo wiedergegeben, wie Beispiel 2 zeigt, bis Sie die Ausgabe umleiten.

Beispiel 5. Passwortdialog mit Ausgabeumleitung

$ kdialog --password "Passwort eingeben" > password.file
$ cat password.file
Secrter

Anstatt das Ergebnis in einer Datei zu speichern, können Sie auch eine Shellvariable nutzen. Dazu brauchen Sie die "backtick" Notation, die Taste finden Sie normalerweise auf der rechten oberen Seite Ihrer Tastatur.

Beispiel 6. Passwortdialog mit Benutzung einer Shellvariable

[bradh@rachel kdialog]$ password=`kdialog --password "Passwort eingeben"`
[bradh@rachel kdialog]$ echo $password
Secreter

Wie in den vorherigen Beispielen nicht gezeigt können Sie auch die --title Option nutzen, um den Titel der Dialogbox anzugeben. Folgendes Beispiel zeigt dies.

Beispiel 7. Passwortdialog, mit Titel

kdialog --title "ACAP entry" --password "Bitte den Zugangscode für den Server eingeben:"

Das Ergebnis ist unten dargestellt.

Abb 2. Passwortdialog Beispiel, inklusive Fenstertitel

kdialog Dialogtypen

Der Passwortdialog ist nur einer der vielen Dialoge, die kdialog anbietet. Dieser Abschnitt zeigt einen Überblick über jeden Typ und beschreibt die Argumente, die jeder Typ benötigt.

Einfache Nachrichtenfenster (msgbox)

Einfache - basic - Nachrichtenfenster (msgbox) sind gedacht um Statusinformationen darzustellen. Es gibt Varianten, um die Wichtigkeit der Information anzuzeigen (Information, Warnung oder Fehler). In jedem Fall ist das Argument der darzustellende Text, wie in den folgenden Beispielen gezeigt.

Beispiel 8. Informations-Nachrichtenfenster (msgbox)

kdialog --msgbox "Passwort korrekt.\n Verbindung zum Server wird hergestellt"

Ein typisches Informations-Nachrichtenfenster (msgbox) ist unten dargestellt.

Abb. 3. Informations-Nachrichtenfenster

Beispiel 9. Warnungs-Nachrichtenfenster

kdialog --sorry "Passwort nicht korrekt.\n Serververbindung wird nicht hergestellt"

Ein typisches Warnungs-Nachrichtenfenster ist unten dargestellt.

Abb. 4. Warnungs-Nachrichtenfenster

Beispiel 10. Fehler-Nachrichtenfenster

kdialog --error "Protokollfehler."

Ein typisches Fehler-Nachrichtenfenster ist unten dargestellt.

Abb. 5. Fehler-Nachrichtenfenster

Der Rückgabewert dieses einfachen Nachrichtenfensters ist Null.

Obwohl in diesen Beispielen nicht benutzt, können Sie auch hier die --title Option nutzen, um dem Fenster einen Titel zu geben.

Nicht-unterbrechende Benachrichtigungen

kdialog unterstützt das Konzept von PopUp Dialogen die nicht den Fokus auf sich ziehen, hier passive PopUps genannt.

--passivepopup benötigt einen darzustellenden Text und eine Zeitüberschreitung. Das Fenster wird automatisch entfernt, sobald der Wert der Zeitüberschreitung (in Sekunden) erreicht ist, oder der Benutzer auf das PopUp klickt.

Beispiel 11. --passivepopup-Dialogbox

./kdialog --title "This is a passive popup" --passivepopup \
	  "It will disappear in about 10 seconds" 10

Ein passives PopUp ist unten dargestellt.

Abb 6. --passivepopup Dialogbox

Weitere Nachrichtenfenster

Manchmal brauchen sie mehr Funktionen, als Ihnen eines der einfachen Nachrichtenfenster erlauben. Vielleicht haben Sie eine potentiell gefährliche Aktion und Sie wollen dem Benutzer eine zweite Chance geben. Oder Sie benötigen eine Entscheidung basierend auf Informationen. kdialog stellt Ihnen einige Werkzeuge zur Verfügung.

Eine --yesno-Dialogbox ist die einfachste dieses Typs, unten dargestellt. Wie die einfachen Nachrichtenfenster zuvor, brauchen Sie einen Text, der in der Box dargestellt wird.

Beispiel 12. --yesno message box

kdialog --title "Beispiel yesno-Dialog" --yesno "Es besteht \
keine Verbindung.\n Verbindung jetzt herstellen?"

Ein yesno-Nachrichtenfenster ist unten dargestellt.

Abb. 7. --yesno-Nachrichtenfenster

Ein Variation des --yesno-Dialogtyps ist --warningyesno, diese modifiziert das Aussehen der Dialogbox etwas.

Beispiel 13. --warningyesno-Nachrichtenfenster

kdialog --title "Beispiel warningyesno-Dialog" \
--warningyesno "Möchten Sie wirklich sämtliche Texte löschen?"

Eine warningyesno-Box ist unten dargestellt.

Abb. 8. --warningyesno-Warnung

Als weitere Variation kann der Dialogtyp --warningcontinuecancel genutzt werden. Dieser hat denselben Aufruf, jedoch unterschiedliche Knopfbeschriftungen und passt in manchen Situationen besser.

Beispiel 14. --warningcontinuecancel message box

kdialog --title "Beispiel warningcontinuecancel-Dialog" \
--warningcontinuecancel "Möchten Sie wirklich alle Texte löschen?"

Eine warningcontinuecancel-Box ist unten dargestellt.

Abb. 9. --warningcontinuecancel warning

Eine andere Variation ist der --yesno Dialogtyp. Hier kann eine dritte Option hinzugefügt werden wie bei dem --yesnocancel Dialogtyp.

Beispiel 15. --yesnocancel message box

kdialog --title "YesNoCancel dialog" --yesnocancel "Programm beenden.\n \
Möchten Sie die Änderungen speichern?"

Ein yesnocancel-Nachrichtenfenster ist unten dargestellt.

Abb. 10. --yesnocancel message box

Es gibt eine --warningyesnocancel Variation, wie unten dargestellt.

Beispiel 16. --warningyesnocancel message box

kdialog --title "YesNoCancel warning dialog" --warningyesnocancel \
"Programm beenden.\n Möchten Sie die Änderungen speichern?"

Ein warningyesnocancel-Nachrichtenfenster ist unten dargestellt.

Abb. 11. --warningyesnocancel-Nachrichtenfenster

Der Rückgabewert ($?) all dieser Dialogboxen folgt einem gemeinsamen Muster. Yes, OK oder Continue gibt 0 zurück, No gibt 1 und Cancel gibt 2 zurück.

Die Anzeige von Dialogen unterdrücken

Manchmal werden Sie kdialog in einer Schleife nutzen oder in einer anderen Situation wo Meldungen vielleicht wiederholt werden. Zum Beispiel arbeiten Sie sich wiederholend durch eine Liste von Dateien und geben bei jeder Datei die Sie wegen Zugriffsrechten nicht öffnen können eine Fehlermeldung aus. Dies kann für den Benutzer eine schlechte Sache sein, da der Fehler immer wiederkehrend erscheint.

Der normale KDE Weg dies zu lösen ist dem Benutzer ein Ankreuzfeld anzubieten, die zukünftige Meldungen unterdrückt. kdialog erlaubt Ihnen das mit der --dontagain-Option zu tun. Diese Option benötigt einen Dateinamen und einen Namen. Wenn der Benutzer nun das Ankreuzfeld aktiviert, wird ein Eintrag mit dem angebenen Namen in die angegebene Datei geschrieben.

Als Beispiel ziehen wir ein "Information Level"-Nachrichtenfenster in Betracht um eine nicht gefundene Datei anzuzeigen.

Beispiel 17. "Information level"-Nachrichtenfenster mit --dontagain

kdialog --dontagain myscript:nofilemsg --msgbox "File not found."

Ein typisches "Information level"-Nachrichtenfenster mit --dontagain ist unten dargestellt.

Abb 12. Information Level Nachrichtenfenster mit --dontagain

Wie oben beschrieben wird ein Eintrag in die Datei geschrieben wenn der Benutzer das Ankreuzfeld aktiviert.

Beispiel 18. --dontagain Dateilisting

$ cat ~/.kde/share/config/myscript
[Notification Messages]
nofilemsg=false

Der Effekt dieses Eintrags ist, dass das zukünftige Anzeigen von Dialogen, die diesen Dateinamen nutzen, unterdrückt werden (im Beispeile von oben bedeutet das myscript:nofilemsg. Die betrifft alle KDE Anwendungen. Seien Sie also vorsichtig mit dem Dateinamen, den Sie wählen.

Dialoge für Benutzereingaben

Es gibt zwei einfache Dialogtypen für Benutzereingaben, den --inputbox-Typ und den --password-Typ. Der Passwortdialog wurde bereits in einem vorherigen Abschnitt ausführlich beschrieben. Siehe kdialog Usage.

Der --inputbox-Dialogtyp benötigt mindestens einen Parameter, der als Text in der Dialogbox dargestellt wird.

Beispiel 19. --inputbox-Dialogbox

kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen:"

Eine input-Dialogbox ist unten dargestellt.

Abb. 13. --inputbox-Dialogbox

Manchmal möchten Sie vielleicht einen Standardtext in der Eingabezeile vorgeben. Sie können dies mit einem optionalen zweiten Parameter tun, wie unten gezeigt.

Beispiel 20. --inputbox-Dialogbox mit Standardparameter

kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen" "Müller"

Eine input-Dialogbox mit vorgebenem Standardtext ist unten gezeigt.

Abb. 14. --inputbox-Dialogbox mit Standardtext

Der Rückgabewert hängt von der verwendeten Schaltfläche ab. OK gibt null ,Cancel gibt eins zurück.

Der eingegebene (oder geänderte bzw. akzeptierte) Text wird auf der Standardausgabe zurückgegeben. Wenn der Benutzer Cancel auswählt wird nichts zurückgegeben.

Den Inhalt von Dateien anzeigen

Eine allgemeine Anforderung an Shellskripte ist die Möglichkeit, eine Datei anzuzeigen. kdialog unterstützt dies mit dem --textbox-Dialogtyp. Dieser Dialogtyp hat einen obligatorischen Parameter, welcher den Namen der darzustellenden Datei angibt. Es gibt zwei optionale Parameter, welche die Höhe und Breite der Dialogbox in Pixel angeben. Sind diese nicht angegeben, so wird der Wert 100 für beide benutzt.

Beispiel 21. --textbox-Dialogbox

kdialog --textbox Makefile

Abb. 15. --textbox-Dialogbox

Beispiel 22. --textbox-Dialogbox mit Dimensionen

kdialog --textbox Makefile 440 200

Abb. 16. --textbox-Dialogbox mit festgelegter Größe (Dimension)

Menü- und Auswahldialoge

Dieser Abschnitt zeigt Ihnen einfache Menüs, Auswahllisten und Auswahlknöpfe. Diese Dialoge werden typischerweise genutzt, um eine Auswahl anzubieten.

Der Typ menu wird benutzt um eine Reihe von Optionen auszuwählen. Jede definierte Option nutzt zwei Argumente, dies können Sie sich wie eine Beschriftung und einen Schlüssel vorstellen. Ein Beispiel ist unten gezeigt.

Beispiel 23. --menu-Dialogbox

kdialog --menu "Sprache wählen:" a "American English" b French d "Oz' English"

Abb. 17. --menu-Dialogbox

Wenn Sie die erste Option auswählen (in diesem Fall American English) und OK drücken, sendet kdialog den zugehörigen Schlüssel (in diesem Fall der Buchstabe a) an die Standardausgabe. Beachten Sie, dass die Schlüssel keine Kleinbuchstaben sein müssen. Sie dürfen auch Zahlen, Großbuchstaben, Zeichenketten oder die Werte von Shell-Variablen verwenden.

Wie bei den anderen Beispielen gesehen, ist der Rückgabewert abhängig vom gewählten Knopf. OK gibt null und Cancel zwei zurück

Eine Checkliste ist ähnlich wie ein menu, allerdings kann der Benutzer mehr als eine Option auswählen. In Ergänzung können Optionen bereits als vorgegeben ausgewählt werden. Um dies zu tun, sollten Sie sich einmal das dritte Argument einer Option anschauen. Sie können es sich als Standardzustand vorstellen. Somit gibt es Schlüssel, Beschriftung und Standardzustand für jede Option. Ein Beispiel ist unten gezeigt.

Beispiel 24. --checklist-Dialogbox

kdialog --checklist "Sprache wählen:" 1 "American English" off \
2 French on 3 "Oz' English" off

Abb. 18. --checklist-Dialogbox

Offensichtlich kann das Ergebnis mehr als einen String enthalten, da der Benutzer mehr als eine Option auswählen kann. Standardmäßig wird das Ergebnis als eine Zeile zurückgegeben, doch sie können die Parameter --separate-output nutzen, um einen Zeilenumbruch nach jedem Eintrag zu erhalten. Diese beiden Fälle werden in den Beispielen unten gezeigt. Alle Optionen werden jeweils benutzt.

Beispiel 25. --checklist-Dialogbox

$ kdialog --checklist "Sprache wählen:" 1 "American English" off \
2  French on 3 "Oz' English" off
"1" "2" "3"
$ kdialog --separate-output --checklist "Sprache wählen:" \
1 "American English" off 2  French on 3 "Oz' English" off
1
2
3

Die Rückgabewerte entsprechen dem Menü-Beispiel. OK gibt null und Cancel eins zurück.

Der radiolist-Typ ist dem checklist-Typ sehr ähnlich, nur kann der Benutzer nur eine Option auswählen. Das Beispiel unten zeigt dies.

Beispiel 26. --radiolist-Dialogbox

$ kdialog --radiolist "Standardsprache wählen:" 1 "American \
English" off  2  French on 3 "Oz' English" off

Abb. 19. --radiolist-Dialogbox

Wenn Sie mehr als einen Eintrag als Standard auswählen möchten, wird nur der letzte angewählte Eintrag ausgewählt. Wenn Sie keinen Eintrag anwählen und der Benutzer auch keine Auswahl vornimmt, wird kdialog einen Fehler melden. Tuen Sie dies also nicht.

Ein Auswahlfeld-Fenster ist geringfügig unterschiedlich zu den vorherigen Menu-Optionen. Sie benutzt keine Schlüssel, stattdessen gibt sie den ausgewählten Text zurück. Ein Beispiel ist unten gezeigt:

Beispiel 27. --combobox Dialogbox

$ kdialog --combobox "Select a flavour:" "Vanilla" "Chocolate" "Strawberry" "Fudge"
Chocolate

Abb 20. --combobox Dialogbox

Dateiauswahl Dialoge

Dieser Abschnitt zeigt Auswahldialoge, um Dateien zu öffnen bzw. zu speichern. Diese Dialoge zeigen die Stärke der darunterliegenden KDE-Dialoge inklusive fortgeschrittener Filtertechniken. Als Ergebnis erhalten Sie Pfade oder URLs.

Der Dialog zum Öffnen einer Datei auszuwählen, wird mit --getopenfilename oder --getopenurl eingeleitet. Diese beiden Kommandos werden auf die gleiche Weise benutzt, nur das Format der Ergebnisse ist unterschiedlich. Jedes gezeigte Beispiel kann für jedes Format angewandt werden. Sie müssen ein Startordner vorgeben und können optional einen Filter vorgeben. Das folgende einfache Beispiel nutzt keinen Filter und greift auf den aktuellen Ordner zu.

Beispiel 28. --getopenfilename-Dialogbox

kdialog --getopenfilename .

Abb. 21. --getopenfilename-Dialogbox

Die Rückgabewerte entsprechen den vorherigen Beispielen. OK gibt null und Cancel eins zurück.

Wie angesprochen unterscheidet sich das Format des Ergebnisses. Dies wird unten gezeigt, in beiden Fällen wird auf die gleiche Datei zurückgegriffen:

Beispiel 29. --getopenfilename-Dialogbox

[bradh@rachel kdialog]$ kdialog --getopenfilename .
/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am
[bradh@rachel kdialog]$ kdialog --getopenurl .
file:/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am

Der Benutzer kann nur eine existierende Datei mit diesen Optionen auswählen.

Wenn Sie eine Menge Dateien öffnen, kann es nützlich sein, den Dialog mit dem zuletzt geöffneten Ordner zu starten. Um dies zu tun können Sie den Pfad vom Dateinamen extrahieren oder Sie benutzen eine spezielle Möglichkeit von KDE, welche auf labels beruht und unten gezeigt wird.

Beispiel 30. --getopenfilename-Dialogbox mit Verzeichnisunterstützung

kdialog --getopenfilename :label1
kdialog --getopenfilename :label1

Jedesmal, wenn Sie das gleiche Label verwenden (den Doppelpunkt nicht vergessen), wird das zuletzt benutze Verzeichnis als Startverzeichnis genutzt. Wurde das Label noch nicht vorher genutzt, wird der persönliche Ordner verwendet.

Bitte beachten Sie, dass die Doppelpunkt-Notierung das zuletzt genutzte Verzeichnis für dieses label in diesem kdialog setzt. Wenn Sie zwei Doppelpunkte verwenden gilt das Label systemweit und wird für alle Anwendungen gültig. Diese systemweite Gültigkeit is wahrscheinlich nicht das, was Sie wollen und ist hier nur der Vollständigkeit wegen aufgeführt.

Meist sind nicht alle Dateien verwendbar und es ist nützlich, die angezeigten Dateien einzugrenzen. Dies kann mit dem optionalen Filterargument geschehen. Der beste Weg ist es, dies wie unten gezeigt mit MIME-Typen zu tun.

Beispiel 31. --getopenfilename-Dialogbox mit MIME-Filter

kdialog --getopenfilename ~/doco/ethereal-userguide "image/png text/html text/plain"

Abb. 22. --getopenfilename-Dialogbox mit MIME-Filter

Ist es nicht möglich, mit MIME-Typen zu arbeiten, so können Sie auch Platzhalter (Wildcards) und eine optionale Filterbeschreibung verwenden. Dies wird im folgenden gezeigt.

Beispiel 32. --getopenfilename-Dialogbox mit Wildcard-Filter

kdialog --getopenfilename . "*.cpp *.cc *.c |C and C++ Source Files"

Abb. 23. --getopenfilename-Dialogbox mit Wildcard-Filter

Die --getsavefilename und --getsaveurl Befehle sind gleich wie die "Datei öffnen"-Dialoge. Ein einfaches Beispiel wird unten gezeigt.:

Beispiel 33. --getsavefilename-Dialogbox

kdialog --getsavefilename .

Abb. 24. --getsavefilename-Dialogbox

Anders als beim "Datei öffnen"-Dialog kann der Benutzer hier einen Dateinamen eingeben, der noch nicht existiert.

Wie beim "Datei öffnen"-Dialog ermöglicht der "Datei speichern"-Dialog die Benutzung der Doppelpunkt-Natation und ebenso das Filtern mit MIME-Typen oder Platzhaltern (wildcards). Dies wird wieder am einem Beispiel verdeutlicht.

Beispiel 34. --getsavefilename-Dialogbox mit filter

kdialog --getsavefilename :label1 "*.cpp *.cc *.c |C and C++ Source Files"

Manchmal möchten Sie keinen Dateinamen angeben, sondern ein Verzeichnis auswählen. Dies erreichen Sie, indem Sie einen "inode/directory" Filter in einem "Datei öffnen"-Dialog angeben, doch besser ist es, den --getexistingdirectory Typ zu nutzen, wie unten gezeigt:

Beispiel 35. --getexistingdirectory-Dialogbox

kdialog --getexistingdirectory .

Abb. 25. --getexistingdirectory-Dialogbox

--getexistingdirectory stellt Ihnen keinerlei Filtermöglichkeiten zur Verfügung , jedoch die gleichen Startverzeichnis-Optionen und Doppelpunkt-Notation.

Dialoge zur Fortschrittsanzeige

Ein Fortschrittsdialog ist ein nützliches, grafisches Element, um dem Benutzer bei Vorgängen mit langer Laufzeit Informationen über den Verlauf zu geben. Der Benutzer sieht anhand des Fortschritts, dass alles wie gewünscht abläuft, anstatt zu glauben seine Maschine sei eingefroren. Falls Sie sich dabei ertappen sollten, einen Dialog nach dem Motto "... dies könnte eine Weile dauern!" zu programmieren, dann ziehen Sie lieber einen Dialog mit Fortschrittsanzeige in Betracht.

Da die Fortschrittsanzeige aktualisiert werden muss, können Sie kdialog nicht auf die bisher gewohnte Weise verwenden. Stattdessen bereiten Sie den Dialog vor (initialisieren) und nutzen dcop, um die Änderungen an den Dialog zu senden.

Ein einfache Benutzung des --progressbar-Kommandos sehen Sie weiter unten. Da das Beispiel etwas länger ist, habe ich die Zeilen numeriert. Die Nummern sind nicht Teil des Skripts und müssen beim Abtippen weggelassen werden. Sie dienen rein als Referenz für Erklärungen.

Beispiel 36. --progressbar Dialogbox

 1   dcopRef=`kdialog --progressbar "Initialising" 4`
2   dcop $dcopRef setProgress 1
3   dcop $dcopRef setLabel "Thinking really hard"
4   sleep 2
5   dcop $dcopRef setProgress 2
6   sleep 2
7   dcop $dcopRef setLabel "Thinking some more"
8   dcop $dcopRef setProgress 3
9   sleep 2
10  dcop $dcopRef setProgress 4
11  sleep 2
12  dcop $dcopRef close

Ich werde zu jeder Zeile etwas sagen. Zeile 1 ruft kdialog mit der Startbezeichnung Initialising auf und setzt die Anzahl der Fortschritte auf 4. Wir speichern den Rückgabewert in einer Variablen (diese kann irgendwie bezeichnet sein. Hier "dcopRef") um ihn später bei den dcop-Kommandos zu nutzen. Zeile 2 setzt den Fortschrittsbalken auf den ersten Schritt und Zeile 3 wechselt die Bezeichnung auf Ich denke nach. Zeile 4 ist nur eine Verzögerung. Dies würde normalerweise der erste Teil eines langen Vorgangs in einer echten Anwendung sein. Zeile 5 erhöht den Fortschrittsbalken um 1, gefolgt von einer weiteren Verzögerung (weiterer Vorgang) in Zeile 6. Zeile 7 wechselt wieder die Bezeichnung. Die Zeilen 8 bis 11 erhöhen den Wert des Fortschrittsbalkens nach ein paar Sekunden Verzögerung. Zeile 12 schließt den Fortschrittsdialog. Ohne dies würde das Fenster offen stehen bleiben. Soll der Dialog sich bevorzugterweise schliessen wenn der Fortschrittsbalken 100% erreicht hat, so können Sie das Argument setAutoClose true mit dcop senden.

Wenn ein Vorgang sehr, sehr lange dauert, entscheidet sich der Benutzer vielleicht, die Aktion besser zu beenden. kdialog kann auch hier helfen, wie das untere Beispiel zeigt.

Beispiel 37. --progressbar Dialogbox mit Abbrechen

 1  dcopRef=`./kdialog --progressbar "Press Cancel at Any time" 10`
2  dcop $dcopRef showCancelButton true

3  until test "true" == `dcop $dcopRef wasCancelled`; do
4    sleep 1
5    inc=$((`dcop $dcopRef progress` + 1))
6    dcop $dcopRef setProgress $inc;
7  done

8  dcop $dcopRef close

Wie im letzten Beispiel startet die erste Zeile kdialog mit einem Starttext. Diesmal mit 10 Schritten. Auch hier speichern wir uns den Rückgabewert in einer Variablen für die spätere Nutzung mit dcop. Zeile 2 macht den Abbrechen-Knopf sichtbar, welcher standardmässig ausgeblendet ist.

Zeile 3 bis 7 ist eine Schleife. Zeile 3 ruft dcop auf, um zu prüfen ob der Abbrechen-Knopf gedrückt wurde. Falls nicht, werden die Zeilen 4 bis 6 aufgerufen. Zeile 4 ist wieder eine Verzögerung, die einen Vorgang in einer echten Anwendung simuliert. Zeile 5 ruft dcop auf, um den aktuellen Wert des Fortschrittsbalkens zu erfahren und um 1 zu erhöhen. Ich hätte auch eine Zählervariable nehmen können, doch so kann ich Ihnen eine weitere Nutzung von dcop zeigen. Zeile 6 setzt den Fortschrittsbalken auf den erhöhten Wert. Zeile 8 schließt den Fortschrittsdialog, wenn der Abbrechen-Knopf gedrückt wurde.

Um das ganze unter KDE 4.2 zu realisieren, ist es notwendig die dcop Nutzung durch dbus Nutzung zu ersetzen. Ich habe das mit qdbus realisiert (ist wohl Teil der QT4 Development Suite)

1  dbusRef=$(kdialog --title "DBUS Progressbar" --progressbar "Press Cancel at Any time" 10)
2  qdbus $dbusRef org.kde.kdialog.ProgressDialog.showCancelButton true

3  until [ "true" == $(qdbus $dbusRef org.kde.kdialog.ProgressDialog.wasCancelled) ]; do
4  sleep 1
5  inc=$(($(qdbus $dbusRef Get org.kde.kdialog.ProgressDialog value) + 1))
6  qdbus $dbusRef Set org.kde.kdialog.ProgressDialog value $inc
7  done

8  qdbus $dbusRef org.kde.kdialog.ProgressDialog.close

Wie im Beispiel für die Version mit dcop wird in der ersten Zeile der Variable $dbusRef die Referenz übergeben, die kdialog im DBUS erhält. Diese wird wie bei dcop benötigt um mit qdbus auf den laufenden Prozess von Kdialog zu zugreifen. Zeile 2 greift nun wie gehabt über qdbus auf den kdialog Prozess zu, um den Cancel Button sichtbar zumachen. Dabei wird die komplette Struktur bis zum Object genannt.

Zeile 3 bis 7 sind wieder die Schleife wie im dcop Part. Es hat sich quasi nur wenig geändert. dcop wurde durch qdbus ersetzt und der Objectpfad wird genannt. Ausserdem benutzen wir nun Set um den Wert (Value) des Progressbar zuändern und Get um den aktuellen Wert (Value) der Progressbar zubekommen.

Zeile 8 wie gehabt.

Copyright und Lizenz

Copyright des englischen Originals liegt bei Brad Hards, 2003, 2004.

Diese Dokumentation ist lizenziert unter der GNU Free Documentation License Version 1.1, mit Ausnahme der unveränderlichen Teile und der Titeltexte.