Kommander/GUI: Unterschied zwischen den Versionen
Escho (Diskussion | Beiträge) (Neuanlage: Beginn des Artikels) |
Escho (Diskussion | Beiträge) (Weiter im Text: langsam wird es interessant) |
||
Zeile 45: | Zeile 45: | ||
Wir haben bereits in der Einleitung gesehen, wie ein neuer Kommander-Dialog erstellt wird. Ganz kurz noch einmal zu Wiederholung: | Wir haben bereits in der Einleitung gesehen, wie ein neuer Kommander-Dialog erstellt wird. Ganz kurz noch einmal zu Wiederholung: | ||
− | * kmdr-editor starten | + | * ''kmdr-editor'' starten |
− | * Dialog drücken bzw. Datei - neu | + | * ''Dialog'' drücken bzw. ''Datei - neu'' |
* Den Dialog speichern unter einem sinnvollen Namen | * Den Dialog speichern unter einem sinnvollen Namen | ||
− | Das Formular (EditorDialog) bekommt von uns nun folgende Eigenschaften zugeteilt: | + | Das Formular (''EditorDialog'') bekommt von uns nun folgende Eigenschaften zugeteilt: |
* '''name: '''GUI | * '''name: '''GUI | ||
Zeile 65: | Zeile 65: | ||
=== <font color="purple">Funktionsweise</font> === | === <font color="purple">Funktionsweise</font> === | ||
− | Das DVB-Script ist so programmiert, daß | + | Das DVB-Script ist so programmiert, daß immer wieder Meldungen über den aktuellen Fortschritt der Videobearbeitung in eine Datei geschrieben werden ( ''text >> ~/.dvb_script_gui.ini/fortschrittfenster'' ). Wie zu sehen ist, werden diese Texte zum schon vorhandenen Dateiinhalt hinzugefügt. |
− | Diese Fortschrittsdatei wird | + | Diese Fortschrittsdatei wird von Kommander mit Hilfe eines Timers und eines ScriptObjects alle 500ms abgefragt. Das Ergebnis der Abfrage wird dann in das Log-Fenster (den TextBrowser) geschrieben. |
=== <font color="purple">Bausteine</font> === | === <font color="purple">Bausteine</font> === | ||
Zeile 73: | Zeile 73: | ||
Wir plazieren einen TextBrowser (aus der Symbolleiste) irgendwo auf dem Formular und stellen folgende Eigenschaften ein: | Wir plazieren einen TextBrowser (aus der Symbolleiste) irgendwo auf dem Formular und stellen folgende Eigenschaften ein: | ||
+ | * '''name: '''fenster1 | ||
+ | * '''minimumSize:''' Breite 490, Höhe 350 | ||
+ | Die Angabe einer Minimum-Größe ist notwendig, damit beim Layout das Fenster nicht geschrumpft wird. | ||
+ | |||
+ | ==== <font color="brown">GroupBox</font> ==== | ||
+ | Auch dieses Widget wird auf eine freie Stelle im Formular kopiert. | ||
+ | |||
+ | * '''name:''' rahmen | ||
+ | * '''font-Punktgröße:''' 12 | ||
+ | * '''font-Fett:''' wahr | ||
+ | * '''title:''' Log | ||
+ | * '''hAlign:''' AlignHCenter | ||
+ | * '''vAlign:''' AlignVCenter | ||
+ | |||
+ | Was ist hier besonderes? | ||
+ | |||
+ | Der Fenstertitel ''Log'' wird vertikal und horizontal zentriert (Align) dargestellt, erhält zur Hervorhebung eine Schriftgröße von 12 Punkten und wird zusätzlich ''fett'' formatiert. | ||
+ | |||
+ | ==== <font color="brown">Layout</font> ==== | ||
+ | * Mit der Maus wird die GroupBox so groß gemacht, daß der TextBrowser vollständig hineinpasst | ||
+ | * Anschließend wird der Browser in die Box geschoben | ||
+ | * Die Groupbox wird markiert und aus dem Kontextmenue folgender Befehl ausgewählt: | ||
+ | * ''In einem Raster anordnen ''(Die neun kleinen Quadrate) | ||
+ | |||
+ | Damit ist der TextBrowser fest in der GroupBox verankert und kann zusammen mit der Box an einen passenden Ort auf dem Formular geschoben werden. | ||
+ | |||
+ | Das Log-Fenster ist fertig. Es fehlt nur noch der Inhalt. | ||
+ | |||
+ | ==== <font color="brown">ScriptObject</font> ==== | ||
+ | Wir haben vorhin gesehen, daß der Bearbeitungsfortschritt des DVB-Scriptes in die Datei ''~/.dvb_script_gui.ini/fortschrittfenster ''geschrieben wird. Den Inhalt dieser Datei fragen wir mit einem ScriptObject ab. | ||
+ | |||
+ | Erzeugen wir also auf ein ScriptObject mit folgenden Eigenschaften: | ||
+ | |||
+ | * '''name:''' refresh_fesnster1 | ||
+ | * '''text:''' fen1 | ||
+ | |||
+ | ==== <font color="brown">Script-Code im ScriptObject</font> ==== | ||
+ | Ein ScriptObject enthält, wie der Name schon andeutet ein Script, also ausführbaren Code. In welcher Sprache wir das Script erstellen, bleibt uns überlassen. | ||
+ | |||
+ | Verwenden wir dazu zum Beispiel die Bash, so lautet die erste Zeile des Scriptes, wie wir es von der Bash-Programmierung gewohnt sind: | ||
+ | |||
+ | <nowiki>#!/bin/bash</nowiki> | ||
+ | |||
+ | Benutzen wir dagegen den Kommander-eigenen Interpreter, dann können wir direkt losschreiben: | ||
+ | |||
+ | input=(env("HOME")+"/.dvb_script_gui.ini/fortschrittfenster") | ||
+ | |||
+ | text=file_read(input) | ||
+ | |||
+ | fenster1.setText(text) | ||
+ | |||
+ | Um diesen Code einzugeben, wählen wir aus dem Kontextmenue des ScriptObjects die Anweisung ''Kommander-Text bearbeiten.'' | ||
+ | |||
+ | ==== <font color="brown">Erläuterungen zum Script-Code</font> ==== | ||
+ | Ich habe den Code in einen kleinen Dreizeiler verpackt, da er sich dann leichter erklären läßt: | ||
+ | |||
+ | '''Erste Zeile: input=(env("HOME")+"/.dvb_script_gui.ini/fortschrittfenster")''' | ||
+ | |||
+ | * '''input:''' Variable, die als String den Pfad zur Datei ''fortschrittfenster'' zugewiesen bekommt. | ||
+ | * '''env("HOME"):''' Die Funktion ''env("...")'' (Funktionsbrowser - Gruppe: ''Kommander'' ) ruft eine Shellvariable auf, in unserem Falle also ''HOME. ''Und in ''HOME'' steht der Pfad zum Heimatverzeichnis des Nutzers (In der Bash: ~) | ||
+ | * '''+:''' Das Pluszeichen wird von Kommander so interpretiert, daß an den String ein weiterer String angefügt wird. | ||
+ | |||
+ | '''Zweite Zeile: '''text=file_read(input) | ||
+ | |||
+ | Der Inhalt der Datei ''fortschrittfenster'' wird mit der Funktion file_read(...) gelesen und in die Variable ''text'' geschrieben (Funktionsbrowser - Gruppe: File). Das sollte ohne weitere Erläuterung klar sein. | ||
+ | |||
+ | '''Dritte Zeile: fenster1.setText(text)''' | ||
+ | |||
+ | Hier wird das Log-Fenster mit dem Inhalt der Variablen ''text'' beschickt. Und das müssen wir etwas genauer betrachten. | ||
+ | |||
+ | Habe ich übrigens schon erwähnt, daß es nicht ganz ohne Sinn ist, die bisherige Arbeit von Zeit zu Zeit zu speichern? Falls nicht, dann erinnere ich hiermit daran. Falls doch, na ja, dann schadet es auch nichts, noch einmal davon zu sprechen. | ||
+ | |||
+ | Erinnert ihr euch daran? Wir hatten unserem TextBrowser den Namen ''fenster1'' gegeben. Das war, glaube ich, noch gar nicht solange her. Unter diesem Namen können wir das Widget ansprechen, und zwar nicht nur von Hand, sondern auch über einen Programmcode. Ist doch praktisch, oder? | ||
+ | |||
+ | Eine Eigenschaft des TextBrowsers lautet ''text'''''.''' Was wir hier eintippen, das erscheint im Anzeigefenster. Wir können auf diese Eigenschaft mit einer Kommander-Funktion zugreifen: | ||
+ | |||
+ | Markieren wir, falls es noch nicht geschehen ist , unser ScriptObject (refresh_fenster1), um den Dreizeiler zu vollenden. Dann wählen wir aus dem Kontextmenue ''Kommander-Text bearbeiten'' und sehen die zwei schon fertigen Programmzeilen. | ||
+ | |||
+ | Die dritte Zeile könnten wir uns nun von oben kopieren und einfügen. Aber so einfach wollen wir es uns dann doch nicht machen. Verwenden wir dazu den Funktionsbrowser von Kommander,'' just for fun'' bzw. um den Umgang mit diesem Intrument etwas genauer kennen zu lernen. Also... | ||
+ | |||
+ | * '''Kontextmenue refresh_fenster1:''' ''Kommander Text bearbeiten'' | ||
+ | * '''Cursor:''' Dorthin stellen, wo der neue Befehl eingefügt werden soll (''Strg + Ende'') | ||
+ | * '''Bedienelement:''' Das Widget (''fenster1'') auswählen, mit dem wir etwas anstellen wollen | ||
+ | * '''Funktion: '''in der Gruppe ''Funktionen'' die Funktion ''setText'' auswählen | ||
+ | * '''Parameter:''' In das Feld ''Text'' den Text ''text'' schreiben (Genial, oder nicht?) | ||
+ | * '''Quote:''' Die Anführungszeichen abwählen, um dem Interpreter mitzuteilen, daß es sich bei dem eben eingegebenen Parameter nicht um den String "text" handelt, sondern um eine Variable mit dem Namen ''text.'' Und diese Variable enthält den Inhalt der Datei ''Fortschrittfenster''. | ||
+ | |||
+ | Es würde mich mal interessieren, warum ich mich bei dem Ausdruck ''string ''andauernd vertippe. Es kommt immer heraus: ''sting''. Ich habe zwar im Hintergrund Musik laufen, aber der Interpret Sting war bei den letzten Liedern nicht dabei. Wahrscheinlich werde ich doch langsam alt und die Finger sind nicht mehr so flink wie die Gedanken. Andererseits fühle ich mich noch körperlich topfit, was bedeuten könnte, daß die Motorik schneller ist als das Hirn. | ||
+ | |||
+ | Hmm, beide Alternativen gefallen mir nicht besonders. Ich entscheide mich damit für die dritte Möglichkeit (Ist ja auch ein Dreizeiler, das kleine Script oben) und stelle fest, daß die Tastatur langsam zu spinnen anfängt. | ||
+ | |||
+ | Äähm, wo waren wir gerade stehen geblieben? Ah ja, bei dem Abwählen der Option ''Quote''! | ||
+ | |||
+ | Wir müssen also nur noch den gerade konstruierten Befehl dem Script hinzufügen. Der blaue Pfeil nach unten bei den Parametern erledigt das für uns, und fertig! | ||
+ | |||
+ | |||
+ | Habe ich übrigens schon erwähnt, daß das Abspeichern zwischendrin..., ja, hab ich schon gesagt! | ||
+ | |||
+ | So damit steht ein wunderschöner Scriptcode im Script-Widget und wartet nur noch darauf, ausgeführt zu weren. Eine Möglichkeiten geht so: | ||
+ | |||
+ | * Einen ExecButton erzeugen, der beim Anklicken das Script Widget startet | ||
+ | |||
+ | Das nutzt uns nur nicht sehr viel. Denn damit bekommen wir den Inhalt der Datei ''Fortschrittfenster'' zwar im Log angezeigt, aber eben nur immer dann, wenn wir den ExecButton drücken. Wir wollen aber die Anzeige ständig auf dem neuesten Stand haben, und zwar automatisch. Also bräuchten wir einen ExecButton, der sich selbst dauernd drückt oder wir verwenden ein interessantes Widget, welches das Aussehen eines uralten Weckers hat: | ||
+ | |||
+ | ==== <font color="brown">Der Timer</font> ==== | ||
{{Kommander_Navibox}} | {{Kommander_Navibox}} |
Version vom 31. Oktober 2008, 23:22 Uhr
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
Einführung: Der Weg zur GUI - Die Funktionen - Screenshots |
Inhaltsverzeichnis
Das Editorfenster
So sieht die GUI aus wenn sie zum Editieren mit dem kmdr-editor aufgerufen wird: Editor-Dialog
Gliederung der GUI
Ich habe die GUI in vier große Abschnitte eingeteilt:
Aktionenauswahl
Links oben können die gewünschten Aktionen durch Drücken vom Buttons ausgewählt werden. Folgende Kommander-Widgets sind dabei beteiligt:
- RadioButton: Auswahl der Aktionen (Brennen, Sichern, usw.)
- Label: Dient zur Anzeige von Kommentaren (Video-DVD...)
- ButtonGroup: Hierin sind die RadioButtons und die Labels organisiert
- ExecButton: Damit wird die ausgewählte Aktion gestartet (Go)
- EditorTabWidget: Weitere Aktionen können über Reiter sichtbar gemacht werden
Log
Im Log-Fenster links unten wird der Bearbeitungsfortschritt der gestarteten Aktion angezeigt. Hier bürgen folgende Widgets für das Gelingen:
- TextBrowser: Hierin erfolgt die Anzeige
- GroupBox: Sieht einfach besser aus, wenn der TextBrowser da drin liegt
Debug-Log
Rechts unten ist das Debug-Log zu finden. Damit kann man, wenn es gewünscht wird, noch genauere Anzeigen des laufenden Scripts bekommen. Da hier die Ausgabe des Standard-Fehlerkanal angezeigt wird, kann man gut nachverfolgen, wo es Probleme gegeben hat, wenn etwas nicht so klappt, wie man es sich eigentlich vorstellt.
- TextWidget: Ausgabe von stderr (Standard-Fehlerkanal)
- RadioButton: Steuern die Aktualisierung der Ausgabe (Ein, Aus)
- ButtonGrop: Darin sind die RadioButtons organisiert
- ExecButton: Fensteranzeige leeren (Clear)
- GroupBox: Läßt das, was zusammen gehört, auch so erscheinen
Unsichtbare Widgets
Klingt gut, der Titel, oder? Ja, die Widgets rechts oben sind tatsächlich unsichtbar im kmdr-executor. Editiert man aber den Dialog, sieht man sie (kmdr-editor).
- ScriptObject: Diese drei Objekte enthalten ausführbaren Kommander- bzw.Bash -Code
- Timer: Periodische Abfrage der Anzeigefenster bzw. Zeitverzögerung
- blaue Abstandslinien: Sind für das Layout wichtig
Das Formular
Wir haben bereits in der Einleitung gesehen, wie ein neuer Kommander-Dialog erstellt wird. Ganz kurz noch einmal zu Wiederholung:
- kmdr-editor starten
- Dialog drücken bzw. Datei - neu
- Den Dialog speichern unter einem sinnvollen Namen
Das Formular (EditorDialog) bekommt von uns nun folgende Eigenschaften zugeteilt:
- name: GUI
- baseSize: Breite 1024, Höhe 768
- caption: dvb_wiki_script oder Vom DVB zur DVD und einiges mehr
Die Zuteilung eines aussagekräftigen Namens, mit dem das Element angesprochen werden kann, ist eminent wichtig. Ich hatte dies beim Programmieren der GUI versäumt. Erst, als die Zuordnung der Elemente mit steigender Komplexität des Dialogs immer undurchsichtiger wurde, habe ich nachträglich Namen vergeben.
Die Basis-Grösse ist die Fenstergrösse, mit der Kommander den Dialog startet. Man könnte auch sagen, der Dialog ist optimiert für eine Bildschirmgrösse von 1024 x 768 Pixel.
Und die Überschrift... Na ja, irgend etwas musste ich ja rein schreiben.
Das Log
Weiter mit dem Log-Fenster links unten.
Funktionsweise
Das DVB-Script ist so programmiert, daß immer wieder Meldungen über den aktuellen Fortschritt der Videobearbeitung in eine Datei geschrieben werden ( text >> ~/.dvb_script_gui.ini/fortschrittfenster ). Wie zu sehen ist, werden diese Texte zum schon vorhandenen Dateiinhalt hinzugefügt.
Diese Fortschrittsdatei wird von Kommander mit Hilfe eines Timers und eines ScriptObjects alle 500ms abgefragt. Das Ergebnis der Abfrage wird dann in das Log-Fenster (den TextBrowser) geschrieben.
Bausteine
TextBrowser
Wir plazieren einen TextBrowser (aus der Symbolleiste) irgendwo auf dem Formular und stellen folgende Eigenschaften ein:
- name: fenster1
- minimumSize: Breite 490, Höhe 350
Die Angabe einer Minimum-Größe ist notwendig, damit beim Layout das Fenster nicht geschrumpft wird.
GroupBox
Auch dieses Widget wird auf eine freie Stelle im Formular kopiert.
- name: rahmen
- font-Punktgröße: 12
- font-Fett: wahr
- title: Log
- hAlign: AlignHCenter
- vAlign: AlignVCenter
Was ist hier besonderes?
Der Fenstertitel Log wird vertikal und horizontal zentriert (Align) dargestellt, erhält zur Hervorhebung eine Schriftgröße von 12 Punkten und wird zusätzlich fett formatiert.
Layout
- Mit der Maus wird die GroupBox so groß gemacht, daß der TextBrowser vollständig hineinpasst
- Anschließend wird der Browser in die Box geschoben
- Die Groupbox wird markiert und aus dem Kontextmenue folgender Befehl ausgewählt:
- In einem Raster anordnen (Die neun kleinen Quadrate)
Damit ist der TextBrowser fest in der GroupBox verankert und kann zusammen mit der Box an einen passenden Ort auf dem Formular geschoben werden.
Das Log-Fenster ist fertig. Es fehlt nur noch der Inhalt.
ScriptObject
Wir haben vorhin gesehen, daß der Bearbeitungsfortschritt des DVB-Scriptes in die Datei ~/.dvb_script_gui.ini/fortschrittfenster geschrieben wird. Den Inhalt dieser Datei fragen wir mit einem ScriptObject ab.
Erzeugen wir also auf ein ScriptObject mit folgenden Eigenschaften:
- name: refresh_fesnster1
- text: fen1
Script-Code im ScriptObject
Ein ScriptObject enthält, wie der Name schon andeutet ein Script, also ausführbaren Code. In welcher Sprache wir das Script erstellen, bleibt uns überlassen.
Verwenden wir dazu zum Beispiel die Bash, so lautet die erste Zeile des Scriptes, wie wir es von der Bash-Programmierung gewohnt sind:
#!/bin/bash
Benutzen wir dagegen den Kommander-eigenen Interpreter, dann können wir direkt losschreiben:
input=(env("HOME")+"/.dvb_script_gui.ini/fortschrittfenster")
text=file_read(input)
fenster1.setText(text)
Um diesen Code einzugeben, wählen wir aus dem Kontextmenue des ScriptObjects die Anweisung Kommander-Text bearbeiten.
Erläuterungen zum Script-Code
Ich habe den Code in einen kleinen Dreizeiler verpackt, da er sich dann leichter erklären läßt:
Erste Zeile: input=(env("HOME")+"/.dvb_script_gui.ini/fortschrittfenster")
- input: Variable, die als String den Pfad zur Datei fortschrittfenster zugewiesen bekommt.
- env("HOME"): Die Funktion env("...") (Funktionsbrowser - Gruppe: Kommander ) ruft eine Shellvariable auf, in unserem Falle also HOME. Und in HOME steht der Pfad zum Heimatverzeichnis des Nutzers (In der Bash: ~)
- +: Das Pluszeichen wird von Kommander so interpretiert, daß an den String ein weiterer String angefügt wird.
Zweite Zeile: text=file_read(input)
Der Inhalt der Datei fortschrittfenster wird mit der Funktion file_read(...) gelesen und in die Variable text geschrieben (Funktionsbrowser - Gruppe: File). Das sollte ohne weitere Erläuterung klar sein.
Dritte Zeile: fenster1.setText(text)
Hier wird das Log-Fenster mit dem Inhalt der Variablen text beschickt. Und das müssen wir etwas genauer betrachten.
Habe ich übrigens schon erwähnt, daß es nicht ganz ohne Sinn ist, die bisherige Arbeit von Zeit zu Zeit zu speichern? Falls nicht, dann erinnere ich hiermit daran. Falls doch, na ja, dann schadet es auch nichts, noch einmal davon zu sprechen.
Erinnert ihr euch daran? Wir hatten unserem TextBrowser den Namen fenster1 gegeben. Das war, glaube ich, noch gar nicht solange her. Unter diesem Namen können wir das Widget ansprechen, und zwar nicht nur von Hand, sondern auch über einen Programmcode. Ist doch praktisch, oder?
Eine Eigenschaft des TextBrowsers lautet text. Was wir hier eintippen, das erscheint im Anzeigefenster. Wir können auf diese Eigenschaft mit einer Kommander-Funktion zugreifen:
Markieren wir, falls es noch nicht geschehen ist , unser ScriptObject (refresh_fenster1), um den Dreizeiler zu vollenden. Dann wählen wir aus dem Kontextmenue Kommander-Text bearbeiten und sehen die zwei schon fertigen Programmzeilen.
Die dritte Zeile könnten wir uns nun von oben kopieren und einfügen. Aber so einfach wollen wir es uns dann doch nicht machen. Verwenden wir dazu den Funktionsbrowser von Kommander, just for fun bzw. um den Umgang mit diesem Intrument etwas genauer kennen zu lernen. Also...
- Kontextmenue refresh_fenster1: Kommander Text bearbeiten
- Cursor: Dorthin stellen, wo der neue Befehl eingefügt werden soll (Strg + Ende)
- Bedienelement: Das Widget (fenster1) auswählen, mit dem wir etwas anstellen wollen
- Funktion: in der Gruppe Funktionen die Funktion setText auswählen
- Parameter: In das Feld Text den Text text schreiben (Genial, oder nicht?)
- Quote: Die Anführungszeichen abwählen, um dem Interpreter mitzuteilen, daß es sich bei dem eben eingegebenen Parameter nicht um den String "text" handelt, sondern um eine Variable mit dem Namen text. Und diese Variable enthält den Inhalt der Datei Fortschrittfenster.
Es würde mich mal interessieren, warum ich mich bei dem Ausdruck string andauernd vertippe. Es kommt immer heraus: sting. Ich habe zwar im Hintergrund Musik laufen, aber der Interpret Sting war bei den letzten Liedern nicht dabei. Wahrscheinlich werde ich doch langsam alt und die Finger sind nicht mehr so flink wie die Gedanken. Andererseits fühle ich mich noch körperlich topfit, was bedeuten könnte, daß die Motorik schneller ist als das Hirn.
Hmm, beide Alternativen gefallen mir nicht besonders. Ich entscheide mich damit für die dritte Möglichkeit (Ist ja auch ein Dreizeiler, das kleine Script oben) und stelle fest, daß die Tastatur langsam zu spinnen anfängt.
Äähm, wo waren wir gerade stehen geblieben? Ah ja, bei dem Abwählen der Option Quote!
Wir müssen also nur noch den gerade konstruierten Befehl dem Script hinzufügen. Der blaue Pfeil nach unten bei den Parametern erledigt das für uns, und fertig!
Habe ich übrigens schon erwähnt, daß das Abspeichern zwischendrin..., ja, hab ich schon gesagt!
So damit steht ein wunderschöner Scriptcode im Script-Widget und wartet nur noch darauf, ausgeführt zu weren. Eine Möglichkeiten geht so:
- Einen ExecButton erzeugen, der beim Anklicken das Script Widget startet
Das nutzt uns nur nicht sehr viel. Denn damit bekommen wir den Inhalt der Datei Fortschrittfenster zwar im Log angezeigt, aber eben nur immer dann, wenn wir den ExecButton drücken. Wir wollen aber die Anzeige ständig auf dem neuesten Stand haben, und zwar automatisch. Also bräuchten wir einen ExecButton, der sich selbst dauernd drückt oder wir verwenden ein interessantes Widget, welches das Aussehen eines uralten Weckers hat:
Der Timer
Einführung: Der Weg zur GUI - Die Funktionen - Screenshots |