Kommander Scripts

 

Davide Garatti

 

 

 

Davide_01

 

 

 

Release 0.1

 

2 luglio 2007

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Indice generale

  Introduzione

  IDE di Kommander (kmdr-editor)

  COMANDI

  Kommander

3.1.1   @dcop

3.1.2   @dcopid ?

3.1.3   @dialog

3.1.4   @env

3.1.5   @exec

3.1.6   @execBegin ... @execEnd

3.1.7   @global(variable)

3.1.8   @null

3.1.9   @parentPid

3.1.10   @pid

3.1.11   @readSetting

3.1.12   @selectedWidgetText

3.1.13   @setGlobal

3.1.14   @widgetText

3.1.15   @writeSetting

  String

3.2.1   @String.length

3.2.2   @String.contains

3.2.3   @String.find

3.2.4   @String.left

3.2.5   @String.right

3.2.6   @String.mid

3.2.7   @String.remove

3.2.8   @String.replace

3.2.9   @String.upper

3.2.10   @String.lower

3.2.11   @String.compare

3.2.12   @String.isEmpty

3.2.13   @String.isNumber

  Message

3.3.1   @Message.error

3.3.2   @Message.info

3.3.3   @Message.question

3.3.4   @Message.warning

  Input

3.4.1   @Input.color

3.4.2   @Input.directory

3.4.3   @Input.double()

3.4.4   @Input.openfile

3.4.5   @Input.openfiles

3.4.6   @Input.password()

3.4.7   @Input.savefile

3.4.8   @Input.text

3.4.9   @Input.value

  File

3.5.1   @File.read

3.5.2   @File.write

3.5.3   @File.append

  Array

3.6.1   @Array.values

3.6.2   @Array.keys

3.6.3   @Array.setValue

3.6.4   @Array.clear

3.6.5   @Array.count

3.6.6   @Array.value

3.6.7   @Array.remove

3.6.8   @Array.fromString

3.6.9   @Array.toString

  Connessioni

  Gestione del Layout della finestra

  Gestione della localizzazione

 

 

 

 

 

 

 

 

 

 

1 Introduzione

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 :

Info-Sistema

Fitness-Sistema

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.

 

 

 

 

 

 

 

 

 

 

2 IDE di Kommander (kmdr-editor)

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.

    Oggetti disponibili:
 

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.

 

3 COMANDI

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.

3.1 Kommander

 

3.1.1 @dcop

 Sintassi :@dcop(appId, object, function, arguments)

     Descrizione :Permette di eseguire una chiamata DCOP ad un programma esterno a     Kommander.

 Esempio :@dcop(“kmail”, “KMailIface”, “checkMail()”, “”)

 

3.1.2 @dcopid ?

 

 Sintassi :kmdr-executor-@pid

 Descrizione :Restituisce il Dcop-ID di un applicazione.

 

3.1.3 @dialog

 

 Sintassi :

 Descrizione :

 Esempio :

3.1.4 @env

 

 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 “$”

 

3.1.5 @exec

 

 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))

 

 

 

3.1.6 @execBegin ... @execEnd

 

 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.

 

 

3.1.7 @global(variable)

 

  Sintassi :@global(nome variabile)

 Descrizione : Restituisce il valore della variabile specificata, precedentemente memorizzato    con il comando @setGlobal(Tempo, 100)

 Esempio :@global(Tempo)

 

 

 

3.1.8 @null

 

   Descrizione :Restituisce un valore nullo e serve per evitare errori da chiamate ad oggetti  non definiti

 

3.1.9 @parentPid

 

 Sintassi :

 Descrizione :

 Esempio :

 

3.1.10 @pid

 

 Sintassi :

 Descrizione :

 Esempio :

 

 

3.1.11 @readSetting

 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,” ”)

 

 

3.1.12 @selectedWidgetText

 

 Sintassi :

         Descrizione :Quando un oggetto può avere più di un valore, ad esempio una lista,  restituisce il testo selezionato

 

3.1.13 @setGlobal

 

 Sintassi :@setGlobal(variable, value)

            Descrizione :Imposta la variabile GLOBALE al valore dato.

 Esempio :@setGlobal(tempo, 100)

3.1.14 @widgetText

 

 Sintassi :@widgetText

 Descrizione :Restituisce il contenuto di un widget

3.1.15 @writeSetting

 

 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”)

 

3.2 String

 

Qui si possono trovare tutti quei comandi utili alla formattazione e al condizionamento dei testi e delle stringhe.

Sono piuttosto comuni ed intuitivi

 

3.2.1 @String.length

 

 Sintassi :@String.length(string)

 Descrizione :Restituisce il numero di caratteri della stringa data

 Esempio :

 

3.2.2 @String.contains

 

 Sintassi :@String.contains(string,substring)

 Descrizione :controlla se nel primo parametro e` presente il secondo

 Esempio :

 

3.2.3 @String.find

 

 Sintassi :@String.find(string)

 Descrizione : Restituisce la posizione della stringa oppure -1 se non la si trova

 Esempio :

 

3.2.4 @String.left

 

 Sintassi :@String.left(string, int)

 Descrizione :Restituisce i primi n (int)  caratteri della stringa

 Esempio :

 

3.2.5 @String.right

 

 Sintassi :@String.right(string, int)

 Descrizione :Restituisce gli ultimi n (int)  caratteri della stringa

 Esempio :

 

3.2.6 @String.mid

 

 Sintassi :@String.mid(string, int start, int end)

 Descrizione :Restituisce i caratteri tra i due estremi indicati

 Esempio :

 

3.2.7 @String.remove

 Sintassi :@String.remove(string, substring)

 Descrizione :Rimuove dalla stringa data la sub stringa specificata

 Esempio :

 

3.2.8 @String.replace

 Sintassi :@String.replace(string, substring find, substring replace)

 Descrizione :Sostituisce dalla stringa data la sub stringa specificata con un altra sub stringa

 Esempio :

 

3.2.9 @String.upper

 Sintassi :@String.upper(string)

 Descrizione :Converte i caratteri in Maiuscolo

 Esempio :

 

3.2.10 @String.lower

 Sintassi :@String.lower(string)

 Descrizione :Converte i caratteri in Minuscolo

 Esempio :

 

 

 

3.2.11 @String.compare

 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 :

 

3.2.12 @String.isEmpty

 Sintassi :@String.isEmpty(string)

 Descrizione :Controlla se la stringa e vuota

 Esempio :

 

3.2.13 @String.isNumber

 Sintassi :@String.isNumber(string)

 Descrizione :Controlla se la stringa e` un numero

 Esempio :

 

3.3 Message

 

Questi sono comandi il cui compito e aprire finestre di warning o altro in cui scrivere messaggi o note.

 

3.3.1 @Message.error

 Sintassi :@Message.error(text, Caption)

 Descrizione :Visualizza messaggio di errore (con relativo suono di sistema)

 Esempio :@Message.error(errore di battitura, errore)

 

3.3.2 @Message.info

 Sintassi :@Message.info(text, Caption)

 Descrizione :Visualizza messaggio di informazione(con relativo suono di sistema)

 Esempio :@Message.info(Attenzione, ciao)

 

 

 

3.3.3 @Message.question

 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 :

 

3.3.4 @Message.warning

 Sintassi :@Message.warning(text, caption, button1, button2, button3)

 Descrizione :come per Message.question ma nel formato di warning con relativo suono di    sistema

 Esempio :

 

 

3.4 Input

 

3.4.1 @Input.color

 Sintassi :@Input.color

 Descrizione :Apre una finestra da cui e possibile scegliere un colore e restiuira il valore

   nel solito formato RGB - #RRGGBB

 Esempio :

 

3.4.2 @Input.directory

 Sintassi :@Input.directory@

 Descrizione :Apre la finestra di selezione delle directory e restituisce ovviamente la directory selezionata ( con tutto il percorso)

 Esempio :

 

3.4.3 @Input.double()

 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))

 

3.4.4 @Input.openfile

 Sintassi :@Input.openfile

 Descrizione :restituisce percorso e nome del file scelto tramite finestra di selezione

 Esempio :@LineEdit1.setText(@Input.openfile)

 

3.4.5 @Input.openfiles

 Sintassi :@Input.openfiles

 Descrizione :restituisce percorso i nomi dei files scelti tramite finestra di selezione

 Esempio :@LineEdit28.setText(@Input.openfiles)

 

3.4.6 @Input.password()

 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)

 

3.4.7 @Input.savefile

 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)

 

 

 

3.4.8 @Input.text

 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))

 

3.4.9 @Input.value

 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))

 

3.5 File

comandi per la gestione dei file @read / @write / @append

3.5.1 @File.read

 Sintassi :@File.read(file)

 Descrizione :Restituisce il contenuto del file dato

 Esempio :

 

3.5.2 @File.write

 Sintassi :@File.write(filestring)

 Descrizione :scrive su un file la stringa data (può essere anche informato html,xml oppure  semplice testo)

 Esempio :

   

3.5.3 @File.append

 Sintassi :@File.append(filestring)

 Descrizione :Appende alla fine del file la stringa data

 Esempio :

3.6 Array

 

 

3.6.1 @Array.values

 Sintassi :@Array.values(array)

 Descrizione :Restituisce la lista di valori presenti nell'array separati da EOL

 Esempio :

   

 

3.6.2 @Array.keys

 Sintassi :@Array.keys(array)

 Descrizione :Restituisce la lista di Chiavi presenti nell'array separati da EOL

 Esempio :

 

3.6.3 @Array.setValue

 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 :

   

 

3.6.4 @Array.clear

 Sintassi :@Array.clear(array)

 Descrizione :Rimuove tutti gli elementi di un array

 Esempio :

   

 

3.6.5 @Array.count

 Sintassi :@Array.count(array)

 Descrizione :Restituisce il numero di elementi presenti nell'array dato

 Esempio :

 

 

3.6.6 @Array.value

 Sintassi :@Array.value(array,key)

 Descrizione :Restituisce il valore della chiave data nel array specificato

 Esempio :

   

 

3.6.7 @Array.remove

 Sintassi :@Array.remove(array,key)

 Descrizione : Rimuove dall'array la chiave ed il valore della chiave specificati

 Esempio :

   

 

3.6.8 @Array.fromString

 Sintassi :@Array.fromString(array,string)

 Descrizione :Riempe un array con la stringa data. la stringa deve avere il formato:

    Chiave\tValore\t

 Esempio :

   

 

3.6.9 @Array.toString

 Sintassi :@Array.toString(array,string)

 Descrizione :Restituisce gli elementi di un array nel formato

   Chiave\tValore\t

 Esempio :

 

 

 

 

 

4 Connessioni

 

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.

 

5 Gestione del Layout della finestra

 

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)

 

 

6 Gestione della localizzazione

 

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”