Development/Tutorials/Shell Scripting with KDE Dialogs (de): Difference between revisions

From KDE TechBase
No edit summary
 
(18 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{Template:I18n/Development/Tutorials/Shell_Scripting_with_KDE_Dialogs}}
{{Improve}}
Original - http://developer.kde.org/documentation/tutorials/kdialog-german/t1.html


== Einleitung und Ausblick ==
== Einleitung und Ausblick ==
Line 26: Line 22:
==== Beispiel 1. Passwortdialog ====
==== Beispiel 1. Passwortdialog ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --password "Bitte geben Sie den Zugangscode des Servers ein:"
kdialog --password "Bitte geben Sie den Zugangscode des Servers ein:"
</code>
</syntaxhighlight>


Lassen Sie uns den Code in Beispiel 1 etwas genauer anschauen. Die Argumente beim Aufruf vonkdialog 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.
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 Siekdialog (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.
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 ====
==== Beispiel 2. Rückgabewert eines Shellskripts ====


<code bash>
<syntaxhighlight lang="bash">
[bradh@rachel bradh]$ kdialog --password "Some Text"
[bradh@rachel bradh]$ kdialog --password "Some Text"
hello
hello
[bradh@rachel bradh]$ echo $?
[bradh@rachel bradh]$ echo $?
0
0
</code>
</syntaxhighlight>


Note
Note


Die $? Variable wird aktualisiert, wenn ein Vordergrundprozess exististiert. Wenn sie die Variable später benötigen, müssen Sie sie sichern.
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.
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.
Line 55: Line 51:
==== Beispiel 3. Shellskript Rückgabewert mit Fehler ====
==== Beispiel 3. Shellskript Rückgabewert mit Fehler ====


<code bash>
<syntaxhighlight lang="bash">
[bradh@rachel bradh]$ kdialog --password
[bradh@rachel bradh]$ kdialog --password
kdialog: '<text>' missing.
kdialog: '<text>' missing.
Line 61: Line 57:
[bradh@rachel bradh]$ echo $?
[bradh@rachel bradh]$ echo $?
254
254
</code>
</syntaxhighlight>


In einem Shellskript ist es von Vorteil, den Rückgabewert nach jedem Aufruf zu prüfen.
In einem Shellskript ist es von Vorteil, den Rückgabewert nach jedem Aufruf zu prüfen.
Line 67: Line 63:
==== Beispiel 4. Passwort Dialog, mit Prüfung des Rückgabewertes ====
==== Beispiel 4. Passwort Dialog, mit Prüfung des Rückgabewertes ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --password "Bitte den Zugangscode für den Server eingeben:"
kdialog --password "Bitte den Zugangscode für den Server eingeben:"
     if [ $? = 0 ]; then
     if [ $? = 0 ]; then
Line 74: Line 70:
    echo " Sie wählten: Abbrechen"
    echo " Sie wählten: Abbrechen"
     fi
     fi
</code>
</syntaxhighlight>


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.
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.
Line 80: Line 76:
==== Beispiel 5. Passwortdialog mit Ausgabeumleitung ====
==== Beispiel 5. Passwortdialog mit Ausgabeumleitung ====


<code bash>
<syntaxhighlight lang="bash">
$ kdialog --password "Passwort eingeben" > password.file
$ kdialog --password "Passwort eingeben" > password.file
$ cat password.file
$ cat password.file
Secrter
Secrter
</code>
</syntaxhighlight>


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 linken unteren Seite Ihrer Tastatur.
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 ====
==== Beispiel 6. Passwortdialog mit Benutzung einer Shellvariable ====


<code bash>
<syntaxhighlight lang="bash">
[bradh@rachel kdialog]$ password=`kdialog --password "Passwort eingeben"`
[bradh@rachel kdialog]$ password=`kdialog --password "Passwort eingeben"`
[bradh@rachel kdialog]$ echo $password
[bradh@rachel kdialog]$ echo $password
Secreter
Secreter
</code>
</syntaxhighlight>


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.
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.
Line 100: Line 96:
==== Beispiel 7. Passwortdialog, mit Titel ====
==== Beispiel 7. Passwortdialog, mit Titel ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "ACAP entry" --password "Bitte den Zugangscode für den Server eingeben:"
kdialog --title "ACAP entry" --password "Bitte den Zugangscode für den Server eingeben:"
</code>
</syntaxhighlight>


Das Ergebnis ist unten dargestellt.
Das Ergebnis ist unten dargestellt.
Line 120: Line 116:
==== Beispiel 8. Informations-Nachrichtenfenster (msgbox) ====
==== Beispiel 8. Informations-Nachrichtenfenster (msgbox) ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --msgbox "Passwort korrekt.\n Verbindung zum Server wird hergestellt"
kdialog --msgbox "Passwort korrekt.\n Verbindung zum Server wird hergestellt"
</code>
</syntaxhighlight>


Ein typisches Informations-Nachrichtenfenster (msgbox) ist unten dargestellt.
Ein typisches Informations-Nachrichtenfenster (msgbox) ist unten dargestellt.
Line 132: Line 128:
==== Beispiel 9. Warnungs-Nachrichtenfenster ====
==== Beispiel 9. Warnungs-Nachrichtenfenster ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --sorry "Passwort nicht korrekt.\n Serververbindung wird nicht hergestellt"
kdialog --sorry "Passwort nicht korrekt.\n Serververbindung wird nicht hergestellt"
</code>
</syntaxhighlight>


Ein typisches Warnungs-Nachrichtenfenster ist unten dargestellt.
Ein typisches Warnungs-Nachrichtenfenster ist unten dargestellt.


[[Image:Shell_Scripting_with_KDE_Dialogs_de-sorry_msgbox_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-sorry_msgbox.png]]


Abb. 4. Warnungs-Nachrichtenfenster
Abb. 4. Warnungs-Nachrichtenfenster
Line 144: Line 140:
==== Beispiel 10. Fehler-Nachrichtenfenster ====
==== Beispiel 10. Fehler-Nachrichtenfenster ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --error "Protokollfehler."
kdialog --error "Protokollfehler."
</code>
</syntaxhighlight>


Ein typisches Fehler-Nachrichtenfenster ist unten dargestellt.
Ein typisches Fehler-Nachrichtenfenster ist unten dargestellt.
Line 166: Line 162:
==== Beispiel 11. --passivepopup-Dialogbox ====
==== Beispiel 11. --passivepopup-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
./kdialog --title "This is a passive popup" --passivepopup \
./kdialog --title "This is a passive popup" --passivepopup \
  "It will disappear in about 10 seconds" 10
  "It will disappear in about 10 seconds" 10
   
   
</code>
</syntaxhighlight>


Ein passives PopUp ist unten dargestellt.
Ein passives PopUp ist unten dargestellt.
Line 186: Line 182:
==== Beispiel 12. --yesno message box ====
==== Beispiel 12. --yesno message box ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "Beispiel yesno-Dialog" --yesno "Es besteht \
kdialog --title "Beispiel yesno-Dialog" --yesno "Es besteht \
keine Verbindung.\n Verbindung jetzt herstellen?"
keine Verbindung.\n Verbindung jetzt herstellen?"
</code>
</syntaxhighlight>


Ein yesno-Nachrichtenfenster ist unten dargestellt.
Ein yesno-Nachrichtenfenster ist unten dargestellt.


[[Image:Shell_Scripting_with_KDE_Dialogs_de-yesno_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-yesno.png]]


Abb. 7. --yesno-Nachrichtenfenster
Abb. 7. --yesno-Nachrichtenfenster
Line 201: Line 197:
==== Beispiel 13. --warningyesno-Nachrichtenfenster ====
==== Beispiel 13. --warningyesno-Nachrichtenfenster ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "Beispiel warningyesno-Dialog" \
kdialog --title "Beispiel warningyesno-Dialog" \
--warningyesno "Möchten Sie wirklich sämtliche Texte löschen?"
--warningyesno "Möchten Sie wirklich sämtliche Texte löschen?"
</code>
</syntaxhighlight>


Eine warningyesno-Box ist unten dargestellt.
Eine warningyesno-Box ist unten dargestellt.
Line 216: Line 212:
==== Beispiel 14. --warningcontinuecancel message box ====
==== Beispiel 14. --warningcontinuecancel message box ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "Beispiel warningcontinuecancel-Dialog" \
kdialog --title "Beispiel warningcontinuecancel-Dialog" \
--warningcontinuecancel "Möchten Sie wirklich alle Texte löschen?"
--warningcontinuecancel "Möchten Sie wirklich alle Texte löschen?"
</code>
</syntaxhighlight>


Eine warningcontinuecancel-Box ist unten dargestellt.
Eine warningcontinuecancel-Box ist unten dargestellt.
Line 231: Line 227:
==== Beispiel 15. --yesnocancel message box ====
==== Beispiel 15. --yesnocancel message box ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "YesNoCancel dialog" --yesnocancel "Programm beenden.\n \
kdialog --title "YesNoCancel dialog" --yesnocancel "Programm beenden.\n \
Möchten Sie die Änderungen speichern?"
Möchten Sie die Änderungen speichern?"
</code>
</syntaxhighlight>


Ein yesnocancel-Nachrichtenfenster ist unten dargestellt.
Ein yesnocancel-Nachrichtenfenster ist unten dargestellt.
Line 246: Line 242:
==== Beispiel 16. --warningyesnocancel message box ====
==== Beispiel 16. --warningyesnocancel message box ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "YesNoCancel warning dialog" --warningyesnocancel \
kdialog --title "YesNoCancel warning dialog" --warningyesnocancel \
"Programm beenden.\n Möchten Sie die Änderungen speichern?"
"Programm beenden.\n Möchten Sie die Änderungen speichern?"
</code>
</syntaxhighlight>


Ein warningyesnocancel-Nachrichtenfenster ist unten dargestellt.
Ein warningyesnocancel-Nachrichtenfenster ist unten dargestellt.
Line 269: Line 265:
==== Beispiel 17. "Information level"-Nachrichtenfenster mit --dontagain ====
==== Beispiel 17. "Information level"-Nachrichtenfenster mit --dontagain ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --dontagain myscript:nofilemsg --msgbox "File not found."
kdialog --dontagain myscript:nofilemsg --msgbox "File not found."
</code>
</syntaxhighlight>


Ein typisches "Information level"-Nachrichtenfenster mit --dontagain ist unten dargestellt.
Ein typisches "Information level"-Nachrichtenfenster mit --dontagain ist unten dargestellt.
Line 283: Line 279:
==== Beispiel 18. --dontagain Dateilisting ====
==== Beispiel 18. --dontagain Dateilisting ====


<code bash>
<syntaxhighlight lang="bash">
$ cat ~/.kde/share/config/myscript
$ cat ~/.kde/share/config/myscript
[Notification Messages]
[Notification Messages]
nofilemsg=false
nofilemsg=false
</code>
</syntaxhighlight>


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.
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.
Line 299: Line 295:
==== Beispiel 19. --inputbox-Dialogbox ====
==== Beispiel 19. --inputbox-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen:"
kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen:"
</code>
</syntaxhighlight>


Eine input-Dialogbox ist unten dargestellt.
Eine input-Dialogbox ist unten dargestellt.


[[Image:Shell_Scripting_with_KDE_Dialogs_de-inputbox_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-input_box.png]]


Abb. 13. --inputbox-Dialogbox
Abb. 13. --inputbox-Dialogbox
Line 313: Line 309:
==== Beispiel 20. --inputbox-Dialogbox mit Standardparameter ====
==== Beispiel 20. --inputbox-Dialogbox mit Standardparameter ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen" "Müller"
kdialog --title "Eingabedialog" --inputbox "Wählen Sie einen Namen" "Müller"
</code>
</syntaxhighlight>


Eine input-Dialogbox mit vorgebenem Standardtext ist unten gezeigt.
Eine input-Dialogbox mit vorgebenem Standardtext ist unten gezeigt.
Line 333: Line 329:
==== Beispiel 21. --textbox-Dialogbox ====
==== Beispiel 21. --textbox-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --textbox Makefile
kdialog --textbox Makefile
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-textbox_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-text_box.png]]


Abb. 15. --textbox-Dialogbox
Abb. 15. --textbox-Dialogbox
Line 343: Line 339:
==== Beispiel 22. --textbox-Dialogbox mit Dimensionen ====
==== Beispiel 22. --textbox-Dialogbox mit Dimensionen ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --textbox Makefile 440 200
kdialog --textbox Makefile 440 200
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-textbox_dimensions_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-textbox_dimensions_dlg.png]]


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


=== Menü- und Auswahldialoge ===
=== Menü- und Auswahldialoge ===
Line 359: Line 355:
==== Beispiel 23. --menu-Dialogbox ====
==== Beispiel 23. --menu-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --menu "Sprache wählen:" a "American English" b French d "Oz' English"
kdialog --menu "Sprache wählen:" a "American English" b French d "Oz' English"
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-menu_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-menu_dlg.png]]
Line 375: Line 371:
==== Beispiel 24. --checklist-Dialogbox ====
==== Beispiel 24. --checklist-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --checklist "Sprache wählen:" 1 "American English" off \
kdialog --checklist "Sprache wählen:" 1 "American English" off \
2 French on 3 "Oz' English" off
2 French on 3 "Oz' English" off
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-checklist_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-checklist_dlg.png]]
Line 388: Line 384:
==== Beispiel 25. --checklist-Dialogbox ====
==== Beispiel 25. --checklist-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
$ kdialog --checklist "Sprache wählen:" 1 "American English" off \
$ kdialog --checklist "Sprache wählen:" 1 "American English" off \
2  French on 3 "Oz' English" off
2  French on 3 "Oz' English" off
Line 397: Line 393:
2
2
3
3
</code>
</syntaxhighlight>


Die Rückgabewerte entsprechen dem Menü-Beispiel. OK gibt null und Cancel eins zurück.
Die Rückgabewerte entsprechen dem Menü-Beispiel. OK gibt null und Cancel eins zurück.
Line 405: Line 401:
==== Beispiel 26. --radiolist-Dialogbox ====
==== Beispiel 26. --radiolist-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
$ kdialog --radiolist "Standardsprache wählen:" 1 "American \
$ kdialog --radiolist "Standardsprache wählen:" 1 "American \
English" off  2  French on 3 "Oz' English" off
English" off  2  French on 3 "Oz' English" off
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-radiolist_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-radiolist_dlg.png]]
Line 420: Line 416:
==== Beispiel 27. --combobox Dialogbox ====
==== Beispiel 27. --combobox Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
$ kdialog --combobox "Select a flavour:" "Vanilla" "Chocolate" "Strawberry" "Fudge"
$ kdialog --combobox "Select a flavour:" "Vanilla" "Chocolate" "Strawberry" "Fudge"
Chocolate
Chocolate
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-combobox_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-combo_box.png]]


Abb 20. --combobox Dialogbox
Abb 20. --combobox Dialogbox
Line 437: Line 433:
==== Beispiel 28. --getopenfilename-Dialogbox ====
==== Beispiel 28. --getopenfilename-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getopenfilename .
kdialog --getopenfilename .
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-getopenfilename_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-getopenfilename_dlg.png]]
Line 451: Line 447:
==== Beispiel 29. --getopenfilename-Dialogbox ====
==== Beispiel 29. --getopenfilename-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
[bradh@rachel kdialog]$ kdialog --getopenfilename .
[bradh@rachel kdialog]$ kdialog --getopenfilename .
/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am
/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am
[bradh@rachel kdialog]$ kdialog --getopenurl .
[bradh@rachel kdialog]$ kdialog --getopenurl .
file:/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am
file:/home/bradh/coding/cvs-vers/kde-head/kdebase/kdialog/Makefile.am
</code>
</syntaxhighlight>


Der Benutzer kann nur eine existierende Datei mit diesen Optionen auswählen.
Der Benutzer kann nur eine existierende Datei mit diesen Optionen auswählen.
Line 464: Line 460:
==== Beispiel 30. --getopenfilename-Dialogbox mit Verzeichnisunterstützung ====
==== Beispiel 30. --getopenfilename-Dialogbox mit Verzeichnisunterstützung ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getopenfilename :label1
kdialog --getopenfilename :label1
kdialog --getopenfilename :label1
kdialog --getopenfilename :label1
</code>
</syntaxhighlight>


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.
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.
Line 477: Line 473:
==== Beispiel 31. --getopenfilename-Dialogbox mit MIME-Filter ====
==== Beispiel 31. --getopenfilename-Dialogbox mit MIME-Filter ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getopenfilename ~/doco/ethereal-userguide "image/png text/html text/plain"
kdialog --getopenfilename ~/doco/ethereal-userguide "image/png text/html text/plain"
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-getopenfilename_mimefilter_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-getopenfilename_mimefilter_dlg.png]]
Line 489: Line 485:
==== Beispiel 32. --getopenfilename-Dialogbox mit Wildcard-Filter ====
==== Beispiel 32. --getopenfilename-Dialogbox mit Wildcard-Filter ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getopenfilename . "*.cpp *.cc *.c |C and C++ Source Files"
kdialog --getopenfilename . "*.cpp *.cc *.c |C and C++ Source Files"
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-wildcardfilter_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-wildcardfilter_dlg.png]]
Line 501: Line 497:
==== Beispiel 33. --getsavefilename-Dialogbox ====
==== Beispiel 33. --getsavefilename-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getsavefilename .
kdialog --getsavefilename .
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-getsavefilename_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-getsavefilename_dlg.png]]
Line 515: Line 511:
==== Beispiel 34. --getsavefilename-Dialogbox mit filter ====
==== Beispiel 34. --getsavefilename-Dialogbox mit filter ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getsavefilename :label1 "*.cpp *.cc *.c |C and C++ Source Files"
kdialog --getsavefilename :label1 "*.cpp *.cc *.c |C and C++ Source Files"
</code>
</syntaxhighlight>


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:
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:
Line 523: Line 519:
==== Beispiel 35. --getexistingdirectory-Dialogbox ====
==== Beispiel 35. --getexistingdirectory-Dialogbox ====


<code bash>
<syntaxhighlight lang="bash">
kdialog --getexistingdirectory .
kdialog --getexistingdirectory .
</code>
</syntaxhighlight>


[[Image:Shell_Scripting_with_KDE_Dialogs_de-getexistingdirectory_dlg.png]]
[[Image:Shell_Scripting_with_KDE_Dialogs_de-getexistingdirectory.png]]


Abb. 25. --getexistingdirectory-Dialogbox
Abb. 25. --getexistingdirectory-Dialogbox
Line 537: Line 533:
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.
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 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.
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.
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.
Line 543: Line 539:
==== Beispiel 36. --progressbar Dialogbox ====
==== Beispiel 36. --progressbar Dialogbox ====


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


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.
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.
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 ====
==== Beispiel 37. --progressbar Dialogbox mit Abbrechen ====


<code bash>
<syntaxhighlight lang="bash">
  1  dcopRef=`./kdialog --progressbar "Press Cancel at Any time" 10`
  1  dcopRef=`./kdialog --progressbar "Press Cancel at Any time" 10`
2  dcop $dcopRef showCancelButton true
2  dcop $dcopRef showCancelButton true


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


8  dcop $dcopRef close
8  dcop $dcopRef close
</code>
</syntaxhighlight>


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.
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.
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)
<syntaxhighlight lang="bash">
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
</syntaxhighlight>
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 und Lizenz ==
Line 586: Line 606:


Diese Dokumentation ist lizenziert unter der GNU Free Documentation License Version 1.1, mit Ausnahme der unveränderlichen Teile und der Titeltexte.
Diese Dokumentation ist lizenziert unter der GNU Free Documentation License Version 1.1, mit Ausnahme der unveränderlichen Teile und der Titeltexte.
[[Category:Shell Scripting]]

Latest revision as of 16:27, 13 July 2012

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.