Kommander Scripts
Davide Garatti
Davide_01
Release 0.1
2 luglio 2007
Kommander e` uno splendido sistema per creare, in modo semplice e veloce, delle interfacce grafiche per i propri script, i quali potrebbero essere dei comuni script Bash piuttosto che python, php od altro, in generale si potrebbe dare un interfaccia grafica a qualsiasi programma da linea di comando.
E` composto essenzialmente da due programmi distinti:
kmdr-editor - IDE con cui potremo creare le GUI
kmdr-executor - Programma che permette l'esecuzione della GUI creata
In Mandriva si installano tramite il pacchetto kdewebdev-kommander
ma nelle altre distribuzioni basta fare una ricerca sul proprio tool di installazione.
Un esempio di ciò che si può fare lo si può vedere già nei miei :
entrambi scaricabili da http://www.kde-apps.org , sempre da questo sito si possono scaricare nella sezione kommander moltissimi altri esempi più o meno semplici grazie ai quali si potrà capire meglio l'utilizzo di questo “comodissimo” programma.
L'IDE genera dei file con estensione .kmdr apribili anche con un comunissimo editor di test.
Editor Kommander si presenta come un normale IDE, con una schermata su cui andremo a costruire la GUI, una barra laterale che ci mostrerà le proprietà di ogni elemento e la solita barra dei menù, su cui in particolare troveremo le icone relative ad ogni elemento grafico attualmente utilizzabile.
Dal menu FILE e possibile creare una nuova finestra, e dopo aver scelto il tipo (assistente , finestra)
avremo un area di lavoro su cui inserire gli oggetti messi a disposizione da Kommander.
Tutti gli oggetti disponibili sono dotati di proprietà su cui agire, per adattarli alle nostre esigenze.
Una volta inseriti, usando su di essi il tasto destro, possiamo accedere alle seguenti opzioni:
Modifica testo si cambia il nome che visualizza l'oggetto, ad esempio “tasto” nella prossima immagine.
Scegli pixmap ti permette di associare un'immagine all'oggetto
ed infine ma e` il piu importante
“Modifica testo di kommander” e` il posto dove andremo a inserire i nostri comandi.
Ciascun elemento ha un proprio nome univoco tramite il quale saremo in grado di richiamare le sue caratteristiche e sotto funzioni.
Il nome di ogni oggetto può essere variato purché rimanga univoco.
Prendiamo ad esempio il tasto “tasto” apriamo il menù Modifica testo di kommander
tramite il tasto funzione... si può accedere ad una maschera che aiuta a formare la corretta sintassi dei comandi, mostrando immediatamente le singole funzioni richiamabili per ogni oggetto, e una comoda descrizione di ciò che il comando dovrebbe fare.
Nella sezione Gruppo si può scegliere tra varie opzioni, ciascuna raggruppa una serie di comandi (di Kommander) ed in particolare il gruppo DCOP permette di accedere ad ogni singolo oggetto inserito dentro alla nostra interfaccia. L'oggetto sarà selezionabile tramite il menù a tendina Oggetto:
Selezionandone uno si troveranno le funzioni ad esso associate, e selezionando una funzione si potrà leggere nel campo Descrizione, sia ciò che fa, si la sintassi corretta.
Gli altri gruppi forniscono comandi tra questi uno dei più utilizzati e quello che scelgo per esempio e` il comando exec, tramite il quale potremmo eseguire un comando esterno della bash.
Nota:
quando si richiama un oggetto da un altro, il nome deve essere sempre preceduto da “@” se lo si richiama tramite il browser di funzioni e lo si inserisce da quest'ultimo, la sintassi sarà ovviamente corretta.
Nota: Come abbiamo già detto, ogni widget deve avere un nome univoco, copiando un oggetto già inserito (per esempio Label1) si ottiene un oggetto con le identiche proprietà del primo ma con un nome che aggiungerà al nome di origine il suffisso _2 (_3 _4 _5 e cosi via) “Label1_2”.
Nessuno vieta di modificare per esempio il primo nome da Label1 a Label1_1
dopo averlo usato per generare i _2, _3, ,,,,, _20 etc in questo modo si potranno creare dei cicli FOR proprio sui suffissi.
@for(A,1,20,1)
{
@label1_@A.setText(exec(cat elenco.txt |grep -n “” | grep ^@A:))
}
@endif
Tutti i comandi presenti in Kommander possono, come si vede, essere inglobati in altri comandi.
Anche la GUI principale (form1) ha la possibilità di contenere comandi e richiami ad altre funzioni. Cliccandoci con il tasto destro si otterrà il solito menù da cui potremo selezionare la voce “Modifica testo di kommander” in questo caso ha una particolare importanza la voce “testo per:” in alto sulla destra, infatti selezionando dal rispettivo menù a tendina l'opzione “INIZIALIZATION”, tutti i comandi che andremo ad inserire li verranno eseguiti all'avvio.
Ecco l'elenco i comandi presenti esattamente come sono raggruppati, in ciascuno di questi specifico la sintassi una breve descrizione e, quando necessario anche un esempio.
Nell'editor delle funzioni integrato nell'IDE esiste comunque una breve descrizione che fa capire l'utilizzo del comando.
Alcuni comandi hanno descrizioni limitate o addirittura assenti, visto che non li ho ancora utilizzati.
Sintassi :@dcop(appId, object, function, arguments)
Descrizione :Permette di eseguire una chiamata DCOP ad un programma esterno a Kommander.
Esempio :@dcop(“kmail”, “KMailIface”, “checkMail()”, “”)
Sintassi :kmdr-executor-@pid
Descrizione :Restituisce il Dcop-ID di un applicazione.
Sintassi :
Descrizione :
Esempio :
Sintassi :@env(Variable)
Descrizione :Restituisce il valore della variabile $VARIABILE della bash, per esempio
@env(PWD) restituisce il valore della variabile globale $PWD, lo stesso che avremmo scrivendo su un terminale il comando “echo. $PWD”
Nota che il nome della variabile all'interno delle parentesi non riporta il carattere “$”
Questo e` certamente uno dei comandi piu utili e grazie a questo si possono richiamare comandi esterni. Di fatto ogni programma da riga di comando potrebbe avere un interfaccia grafica.
Sintassi :@exec(command)
Descrizione :Restituisce il risultato del comando bash (o altro) passato.
Esempio :@exec(df) restituisce il risultato del comando “df”
Accetta ovviamente pipe e ridirezioni
@exec(cat elencotelefono.txt | grep -i Davide | wc -l)
e ovviamente il suo risultato può essere passato ad altri widgets
@TextBrowser1.setText(@exec(df))
Sintassi : @execBegin(php)
@execBegin#!/usr/bin/php
Descrizione :Simile al comando @exec, ma con la possibilità di supportare lo shebang e gli script multipli. usato in caso di php python etc.
Sintassi :@global(nome variabile)
Descrizione : Restituisce il valore della variabile specificata, precedentemente memorizzato con il comando @setGlobal(Tempo, 100)
Esempio :@global(Tempo)
Descrizione :Restituisce un valore nullo e serve per evitare errori da chiamate ad oggetti non definiti
Sintassi :
Descrizione :
Esempio :
Sintassi :
Descrizione :
Esempio :
Sintassi :@readSetting(key, defaultValue)
Descrizione :Legge il valore di un settaggio precedentemente dichiarato tramite @writeSetting(key, value), la coppia chiave-valore verrà memorizzata nel file kommaderrc che si può visualizzare in ~/.kde/share/config/kommanderrc
per ogni interfaccia creata e lanciata verranno scritte su questo file i valori delle righe simili alle seguenti:
[/home/garatti/Documents/Programmazione/KOMMANDER-SCRIPT/Programmi/Info-Sistema/rilascio/Info-Sistema.kmdr]
CHECK_SENS=0
FAN_SEL=1
LE_CORR=1
TEMP_SEL=1
per richiamare il valore di LE_CORR si usera @readSetting(LE_CORR,” ”)
Sintassi :
Descrizione :Quando un oggetto può avere più di un valore, ad esempio una lista, restituisce il testo selezionato
Sintassi :@setGlobal(variable, value)
Descrizione :Imposta la variabile GLOBALE al valore dato.
Esempio :@setGlobal(tempo, 100)
Sintassi :@widgetText
Descrizione :Restituisce il contenuto di un widget
Sintassi :@writeSetting(key, value)
Descrizione :Scrive nel file ~/.kde/share/config/kommanderrc la coppia chiave-valore che andremo in seguito a leggere tramite il comando @readSetting(key, defaultValue)
se vogliamo assegnare il valore 12 ad un eventuale settaggio “PIPPO” useremo
@writeSetting(PIPPO,”12”)
Qui si possono trovare tutti quei comandi utili alla formattazione e al condizionamento dei testi e delle stringhe.
Sono piuttosto comuni ed intuitivi
Sintassi :@String.length(string)
Descrizione :Restituisce il numero di caratteri della stringa data
Esempio :
Sintassi :@String.contains(string,substring)
Descrizione :controlla se nel primo parametro e` presente il secondo
Esempio :
Sintassi :@String.find(string)
Descrizione : Restituisce la posizione della stringa oppure -1 se non la si trova
Esempio :
Sintassi :@String.left(string, int)
Descrizione :Restituisce i primi n (int) caratteri della stringa
Esempio :
Sintassi :@String.right(string, int)
Descrizione :Restituisce gli ultimi n (int) caratteri della stringa
Esempio :
Sintassi :@String.mid(string, int start, int end)
Descrizione :Restituisce i caratteri tra i due estremi indicati
Esempio :
Sintassi :@String.remove(string, substring)
Descrizione :Rimuove dalla stringa data la sub stringa specificata
Esempio :
Sintassi :@String.replace(string, substring find, substring replace)
Descrizione :Sostituisce dalla stringa data la sub stringa specificata con un altra sub stringa
Esempio :
Sintassi :@String.upper(string)
Descrizione :Converte i caratteri in Maiuscolo
Esempio :
Sintassi :@String.lower(string)
Descrizione :Converte i caratteri in Minuscolo
Esempio :
Sintassi :@String.compare(string, string)
Descrizione :Restituisce 0 se le due stringhe sono identiche -1 se la prima e più bassa e 1 se più alta della seconda
Esempio :
Sintassi :@String.isEmpty(string)
Descrizione :Controlla se la stringa e vuota
Esempio :
Sintassi :@String.isNumber(string)
Descrizione :Controlla se la stringa e` un numero
Esempio :
Questi sono comandi il cui compito e aprire finestre di warning o altro in cui scrivere messaggi o note.
Sintassi :@Message.error(text, Caption)
Descrizione :Visualizza messaggio di errore (con relativo suono di sistema)
Esempio :@Message.error(errore di battitura, errore)
Sintassi :@Message.info(text, Caption)
Descrizione :Visualizza messaggio di informazione(con relativo suono di sistema)
Esempio :@Message.info(Attenzione, ciao)
Sintassi :@Message.question(text, caption, button1, button2, button3)
Descrizione :restituisce il numero del tasto premuto su una finestra di messaggio che proporrà la domanda TEXT, il terzo tasto e di default “cancel”
Esempio :
Sintassi :@Message.warning(text, caption, button1, button2, button3)
Descrizione :come per Message.question ma nel formato di warning con relativo suono di sistema
Esempio :
Sintassi :@Input.color
Descrizione :Apre una finestra da cui e possibile scegliere un colore e restiuira il valore
nel solito formato RGB - #RRGGBB
Esempio :
Sintassi :@Input.directory@
Descrizione :Apre la finestra di selezione delle directory e restituisce ovviamente la directory selezionata ( con tutto il percorso)
Esempio :
Sintassi :@Input.double(caption, Label, value, min, max, step)
Descrizione : Restituisce il Valore inserito nella finestra di selezione che si aprirà,
dove “LABEL” sarà il testo presente sopra al valore iniziale, il valore iniziale sarà impostato dal parametro “VALUE” potrà essere modificato a passi predefiniti tramite il parametro “STEP” (anche con virgola) entro un range definito dai valori “MIN” e “MAX”. Il parametro prova e` il nome della finestra di selezione.
Esempio :@LineEdit1.setText(@Input.double(SELEZIONE, "inserisci il guadagno scelto", 10, 0, 30, 2))
Sintassi :@Input.openfile
Descrizione :restituisce percorso e nome del file scelto tramite finestra di selezione
Esempio :@LineEdit1.setText(@Input.openfile)
Sintassi :@Input.openfiles
Descrizione :restituisce percorso i nomi dei files scelti tramite finestra di selezione
Esempio :@LineEdit28.setText(@Input.openfiles)
Sintassi :@Input.password(caption)
Descrizione :restituisce la password inserita nella finestra che comparirà (l'inserzione avviene tramite pallini neri, ma il risultato e` ovviamente in chiaro)
Esempio :@LineEdit1.setText(@Input.password(Inserisci password))
(esempio solo per vedere che cosa restituisce)
Sintassi :@Input.savefile
Descrizione :restituisce percorso e nome del file selezionato tramite finestra (il nome lo si puo ovviamente anche scrivere)
Esempio :@File.write(@Input.savefile, stringa)
Sintassi :@Input.text(Caption, Label, default)
Descrizione :restituisce il testo inserito nella finestra che appare
Caption = nome finestra
Label = scritta sopra alla linea di scrittura
default = valore preimpostato (non necessario)
Esempio :@LineEdit28.setText(@Input.text(Caption, Label, default))
Sintassi :@Input.value(caption, Label, value, min, max, step)
Descrizione :Come @Input.double ma accetta solo numeri interi
Esempio :@LineEdit28.setText(@Input.value(Caption, Label, 12, 1, 5, 1))
comandi per la gestione dei file @read / @write / @append
Sintassi :@File.read(file)
Descrizione :Restituisce il contenuto del file dato
Esempio :
Sintassi :@File.write(filestring)
Descrizione :scrive su un file la stringa data (può essere anche informato html,xml oppure semplice testo)
Esempio :
Sintassi :@File.append(filestring)
Descrizione :Appende alla fine del file la stringa data
Esempio :
Sintassi :@Array.values(array)
Descrizione :Restituisce la lista di valori presenti nell'array separati da EOL
Esempio :
Sintassi :@Array.keys(array)
Descrizione :Restituisce la lista di Chiavi presenti nell'array separati da EOL
Esempio :
Sintassi :@Array.setValue(array, key, value)
Descrizione :Imposta nella array una chiave ed un valore associato alla chiave. In caso che l'array non ci sia lo creerà.
Esempio :
Sintassi :@Array.clear(array)
Descrizione :Rimuove tutti gli elementi di un array
Esempio :
Sintassi :@Array.count(array)
Descrizione :Restituisce il numero di elementi presenti nell'array dato
Esempio :
Sintassi :@Array.value(array,key)
Descrizione :Restituisce il valore della chiave data nel array specificato
Esempio :
Sintassi :@Array.remove(array,key)
Descrizione : Rimuove dall'array la chiave ed il valore della chiave specificati
Esempio :
Sintassi :@Array.fromString(array,string)
Descrizione :Riempe un array con la stringa data. la stringa deve avere il formato:
Chiave\tValore\t
Esempio :
Sintassi :@Array.toString(array,string)
Descrizione :Restituisce gli elementi di un array nel formato
Chiave\tValore\t
Esempio :
Ogni oggetto può essere connesso ad un altro usando l'apposito form di connessione, basta selezionare l'oggetto e l'azione che andremo a relazionare nella finestra di sinistra, per esempio possiamo selezionare un Combobox (ovviamente la lista presenta i vari oggetti inseriti nella nostra GUI), specificare che al cambio del testo del Combobox, l'oggetto selezionato nella finestra di destra, per esempio uno ScriptObject venga eseguito.
Tramite lo stesso processo si posso legare differenti eventi ad altrettante azioni. eseguire, disabilitare, abilitare etc.
Quando avremo completato il lavoro di inserzione dei vari oggetti e il popolamento degli stessi ciascuno con i propri comandi, dovremo passare ad organizzare la finestra e gli oggetti in essa contenuti in modo da rendere la GUI pulita e correttamente gestibile durante l'esecuzione. in pratica se si ridimensiona la finestra , gli oggetti in essa contenuti dovranno necessariamente ridimensionarsi in modo “composto”. per fare questo basta usare CTRL+G, il segreto e partire dal basso o per meglio dire dall'oggetto principale, ad esempio si partirà dall'oggetto FORM e via via si passera a dare lo stesso comando agli oggetti secondari.
Il risultato lo si può verificare durante il ridimensionamento della finestra in esecuzione.
Utile per una corretta visualizzazione e la scelta di un font e di una appropriata dimensione.
Un altro passo importante anche se non essenziale, e quello di associare un numero ad ogni elemento in pratica si va a definire il percorso del cursore a seguito dei TAB.
Per farlo si clicca sulla terza icona del menù, dopodiché compariranno dei pallini blu numerati su cui andremo a cliccare una volta e nella sequenza che desidereremo seguire, i numeri si aggiorneranno automaticamente ad ogni nostro click.
Gli oggetti possono anche essere vincolati a piccoli gruppi selezionando i vari widgets e premendo su uno dei seguenti tasti a seconda di che tipo di raggruppamento si vuole fare.
Per selezionare più oggetti tenere premuto il tasto CTRL + selezione con il mouse (tasto sinistro premuto)
Gli script dovrebbero essere fatti in “inglese”, anche se apparentemente problematica questa gestione consente di poter rendere tutti i nostri script traducibili da chiunque ed in qualsiasi lingua.
Prima di tutto occorre installare kbabel per la traduzione dei file .po estrapolati dai file .kmdr
Si genera il file po dallo script con il seguente comando
$ kmdr2po <Nome del programma>.kmdr
Nota: lo script kmdr2po richiama male lo script extrackmdr
#!/bin/sh
if [ -z $1 ]; then
echo "Makepo extracts strings for translation from Kommander dialog."
echo "Usage: kmdr2po <Kommander dialog>"
else
./extractkmdr $1 >_from_rc.cc
xgettext -C -F --default-domain=`basename $1 .kmdr` \
--keyword=i18n --keyword=@i18n $1 _from_rc.cc
rm _from_rc.cc
fi
Occorre quindi editare come SU il file /usr/bin/kmdr2po
rimuovendo il ./
In genere il comando genera dei messaggi di Attenzione o di errore che andrebbero risolti.
in caso di aggiornamento di un programma già tradotto si può aggiornare il vecchio file .po tramite il comando MSGMERGE
Con la seguente sintassi:
msgmerge Fitness-Sistema_1.po Fitness-Sistema.po > Fitness-Sistema_OK.po
Alla fine della completa traduzione del file .po tramite kbabel, l'icona del file sarà una torta quasi completamente verde, la sezione rossa indica la presenza di voci non tradotte mentre quella blu indica voci segnate con il termini fuzzy, in genere quando sono nella condizione senza parti rosse, provvedo al controllo delle voci Fuzzy e alla rimozione di ogni riga commentata “#, Fuzzy”, il file avràa questo punto l'icona completamente verde. Non ci rimane che “compilare” con il comando :
msgfmt Fitness-Sistema.po
viene generato un file message.mo che va rinominato con il nome del programma quindi Fitness-Sistema.mo e inserito nelle directory opportune
directory per file .mo
$HOME/.kde/share/locale/<your language>/LC_MESSAGES/
a livello singolo user, oppure per tutti (livello globale)
$KDEDIR/share/locale/<your language>/LC_MESSAGES/
Ovviamente nel nostro caso dovremo sostituire <your language> con “it”