Geekzeug

Bastelirrsinn: Abhaken-GUI-Maker, mit Mini-Lektion

Wenn man sich zweimal eine Liste zum Abhaken gemacht hat - und keinen Bock auf ein drittes Mal hat ...

Tja, manchmal bastelt man doch nur um der Bastelei willen, gell? Ich wollte jedenfalls irgendwann mal zu irgendwelchen Ereignissen festhalten, welches zuerst 10 mal oder so vorkommt. Und zwar etwas hübscher als Tabelle. Auf Papier. Und nun wollte ich das Ganze am Rechner, ebenfalls in hübsch – heißt hier aber nur: Nicht nur Tabellekalkulation ;) Und vielleicht brauche ich das auch noch mal für andere Dinge. Folglich musste ein Abhaken-GUI-Generator her.

Da das Projekt wohl für niemanden einen ernsthaften Nutzen haben dürfte, erspare ich mir mal, jeden einzelnen Code-Furz zu erklären. Stattdessen: Kurz was zum Projekt, dann eine Mini-Lektion zum Mischen von Positional- und Named-Parametern bei Shell-Skripten, dann der Code fürs Selbststudium.

Abhaken-GUI-Maker

Die eigentlichen GUIs mit den Listen sind AutoHotkey-Skripte, der Generator ist ein Shell-Skript. Warum dieser Mix? Es sind für mich persönlich einfach zwei völlig unterschiedliche Tools. AutoHotkey nutze ich für Hotkeys und Textbausteine sowie für Windows-Fenster-Angelgenheiten – und das sind die großen Stärken der Sprache.

Bash hingegen nutze ich für so ziemlich alles andere, also auch zum Basteln von AutoHotkey-Skripten. Vermutlich hätte sich das alles auch mit AutoHotkey erledigen lassen, aber tendenziell schlechter – und ich hätte mich einarbeiten müssen. Egal, jedenfalls lautet ein Aufruf:

checkermaker.sh -r 5 -i mein_hintergrundbild -o meine_gui BMW Atari Benz Kia VW Audi Ford Fiat Opel

Und das erzeugt eine GUI mit 5 Reihen (r) Checkboxen, einem Hintergrundbild (i), dem Dateinamen „meine_gui“ (o) und Überschriften wie übergeben. Und eine Linie, um den „Zielbereich“ bei längeren Listen besser zu sehen.

gui mit häkchen und auto-spalten.
Von welcher Marke überqueren zuerst 5 Autos die Ampel? Oder sowas …

Funktionen hat das Teil nicht – man kann nur Häkchen setzen. Falls Ihr das Ganze aber als Anregung für eigene GUI-Generatoren nutzen wollt, ließe sich das leicht erweitern. Das eigentlich Interessante: Der Mix aus benannten Argumenten/Optionen (-r -i -o) und positionalen Parametern.

Parameter-Mix

Wie das Skripten mit den benannten und positionalen Parametern funktioniert, habe ich bei Dev-Insider schon mal beschrieben. Hier geht es nur um den Mix.

Das Problem: Positionale Parameter werden einfach der Reihenfolge nach angesprochen, mit $1, $2 und so weiter. Wenn Parameter aber über Optionen, also Schalter wie „-r“ oder „-o“, übergeben werden, werden sie meist manuell Variablen zugeordnet. So dass zum Beispiel eine angegebene Ausgabedatei nicht über „$1“, sondern über ein sprechendes „$outputfile“ angesprochen werden kann.

Will man aber nun beide Varianten nutzen, sind die Optionen den positionalen Parametern natürlich im Weg. Und da Optionen nun mal naturgemäß optional sind, weiß man in der Regel nicht, wie viele denn nun gesetzt wurden.

Zunächst mal der Code:

while getopts "o:r:i:" option; do
    case $option in
        o)
        outfile="$OPTARG"
        ;;
        r)
        rows="$OPTARG"
        ;;
        i)
        image="$OPTARG"
        ;;
    esac
done
## shift removes named parameters - leaves positional parameters
shift "$((OPTIND-1))"

Zunächst verarbeitet die while-Schleife die drei Optionen für Output-File, Rows und Image – das ist die Standardvorgehensweise. Der Kniff: Die shift-Anweisung verschiebt die übergebenen Parameter quasi nach links, um „OPTIND-1“ viele Stellen (OPTIND steht für Optionen-Index). Einfacher ausgedrückt: Es verwirft alle von getopts verarbeiteten Optionen aus der Parameterliste.

Alles, was dann nach den Optionen kommt, wird wie üblich mit $1, $2 etc. angesprochen.

Der Code

Und hier noch der komplette Bash-Code, der AutoHoktey-Code erzeugt. Achtung: Das Ding funktioniert zwar so wie oben beschrieben, ist aber kein fertiges Produkt! Es gibt keine Fehlerausgabe, keine Hinweise auf zu lange Spaltennamen und der produzierte Code ist auch nicht elegant, sondern redundant. Aber das ist bei so einer popeligen GUI auch furchtbar egal ;)

#!/bin/bash

while getopts "o:r:i:" option; do
    case $option in
        o)
        outfile="$OPTARG"
        ;;
        r)
        rows="$OPTARG"
        ;;
        i)
        image="$OPTARG"
        ;;
    esac
done
## shift removes named parameters - leaves positional parameters
shift "$((OPTIND-1))"

##### Variables
width=$(( 90 + $(( $# * 60 )) ))
height=$(( 90 + $(( $rows * 60 )) ))
line=$(( $height - 170 ))
imageheight=$(( $height / 100 * 90 ))
imagepos=$(( $height - $imageheight ))
imageposx=$(( $width / 8 ))

##### Header
echo -e '
#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%

;## Optional icon
;# Menu Tray, Icon, %A_ScriptDir%\\foobar.ico

' > "$outfile".ahk

##### Checkboxes
for x in $( seq 1 1 $# ); do
    for y in $( seq 1 1 $rows); do
        ##### w15 and h15 to avoid border if active - weird behaviour ...
        echo "Gui Add, CheckBox, x$(( 60 * $x )) y$(( 60 * $y )) w15 h15" >> $outfile.ahk
    done
done

##### Textedits
echo "Gui, Font, s12" >> $outfile.ahk
for f in $@; do
    n=$(( $n + 1 ))
    echo "Gui Add, Text, x$(( 60 * $n )) y8 w55 h23 +0x200, $f" >> $outfile.ahk
done

##### BlingBling
echo "Gui Add, Text, x0 y$line w$width h2 0x10" >> $outfile.ahk
echo "Gui Add, Picture, x$imageposx y$imagepos w-1 h$imageheight +0x4000000, %A_ScriptDir%\\$image" >> $outfile.ahk

##### Footer
echo -e "
Gui Show, w$width h$height, $outfile
Return
GuiEscape:
GuiClose:
    ExitApp
" >> $outfile.ahk

Falls Euch irgendwas interessiert, etwa wie der Checkbox-Part funktioniert, fragt einfach. Und der Vollständigkeit halber, hier noch ein Auszug aus dem produzierten AutoHotkey-Code:

#NoEnv
#SingleInstance Force
SetWorkingDir %A_ScriptDir%

;## Optional icon
;# Menu Tray, Icon, %A_ScriptDir%\foobar.ico


Gui Add, CheckBox, x60 y60 w15 h15
Gui Add, CheckBox, x60 y120 w15 h15
Gui Add, CheckBox, x60 y180 w15 h15
Gui Add, CheckBox, x60 y240 w15 h15
Gui Add, CheckBox, x60 y300 w15 h15
Gui Add, CheckBox, x120 y60 w15 h15
Gui Add, CheckBox, x120 y120 w15 h15
...
Gui, Font, s12
Gui Add, Text, x60 y8 w55 h23 +0x200, BMW
Gui Add, Text, x120 y8 w55 h23 +0x200, Atari
Gui Add, Text, x180 y8 w55 h23 +0x200, Benz
...
Gui Add, Text, x0 y220 w630 h2 0x10
Gui Add, Picture, x78 y120 w-1 h270 +0x4000000, %A_ScriptDir%\picasso_skater.png

Gui Show, w630 h390, AutoChecker
Return
GuiEscape:
GuiClose:
    ExitApp

Mehr zum Thema Bash – mehr zum Thema AutoHotkey.

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Schließen

Ooopsi!

Bitte deaktiviere Deinen Adblocker.