myAppSerial (III)
Bene oggi introduciamo la possibilità di ripetere nel tempo l’ invio del nostro comando in modo automatico.
myTry02
Per far questo aggiungiamo alla nostra GUI una myEntFrame dove inseriremo il tempo di ripetizione e un myChkButton per abilitare l’ invio automatico.
Sempre per la filosofia dei templates selezioniamo e copiamo da riga 339 a riga 385 del nostro script myAppSerial e incolliamo alla fine della sezione TX, prima del Main incolliamo la precedente copia.
Dopo le modifiche descritte successivamente il risultato è il seguente:
#myEntFrame (cmd mSec)
# ridefinisco la callback
def on_activate(widg, *data):
pass
#fram, [labe, xBoxcmdB, entr, call]
obje, othe = myEntFrame(name='100',
numb=5,
call=on_activate, data=[],
nFra='mSec', bFra=1, sFra=Gtk.SHADOW_ETCHED_OUT,
tFra='h', aFra=[False, False, 1])
# referenzio l'oggetto
self.ent_mSec = othe[2]
# insert object in application
self.boxCmd.pack_start(obje, False, False, 1)
#myRepeat
# flag per la ripetizione della callback
self.enaRepeat = False
def myRepeat(*data):
print self.entCmdSerial.get_text()
return self.enaRepeat
#myChkButton (enable Repeat)
# ridefinisco la callback
def on_clicked(widg, name, *data):
if widg.get_active():
self.enaRepeat = True
GLib.timeout_add(int(self.ent_mSec.get_text()), myRepeat)
else:
self.enaRepeat = False
# butt, call
obje, othe = myChkButton(name='Ena',
valu=0, colo='black',
call= on_clicked, data=['-',])
# referenzio l'oggetto
self.chkCR = obje
# fram,[labe,xBox]
obj1, oth1 = myFrame(name='Repeat', obje=obje, colo='black',
bord=2, shad=Gtk.SHADOW_ETCHED_OUT,
tBox='h' )
# insert object in application
self.boxCmd.pack_start(obj1, False, False, 1)
Abbiamo modificato quanto segue sulla nuova myEntFrame:
- Eliminiamo il contenuto della callback on_activate e inseriamo l’ istruzione pass. Questo perche’ la nostra callback non deve fare nulla.
- Il valore iniziale di default da name=’‘ in name=‘100’
- La lunghezza della entry da numb=29 in numb=5
- La label da cmd.Serial in mSec
- Il riferimento della nostra entry da self.entCmdSerial in self.ent_mSec
Abbiamo modificato quanto segue sul nuovo myChkButton:
- Abbiamo Copiato dal precedente myChkButton il codice della callback on_clicked e modificato il contenuto come segue:
def on_clicked(widg, name, *data):
if widg.get_active():
self.enaRepeat = True
GLib.timeout_add(int(self.ent_mSec.get_text()), myRepeat)
else:
self.enaRepeat = False
Come potete vedere abbiamo sfruttato la chiamata differita GLib.timeout_add per regolare il tempo di ripetizione.
myRepeat
Nella definizione del metodo myRepeat abbiamo sfruttato la variabile self.enaRepeat. Quando questa è uguale a False rimuove se stessa dalla lista che l’ oggetto GLib.timeout usa per richiamare i metodi in modo differito.
#myRepeat
# flag per la ripetizione della callback
self.enaRepeat = False
def myRepeat(*data):
print self.entCmdSerial.get_text()
return self.enaRepeat
Proviamo ad avviare il nostro script.
Scriviamo qualcosa da inviare sulla myEntFrame cmd.Serial.
Attiviamo l’invio ripetuto cliccando sul nostro myChkButton Repeat.
Il risultato sarà il seguente:
myAppSerial in esecuzione.
Se vogliamo terminare l’ invio automatico basterà cliccare di nuovo sul nostro myChkButton Repeat.
Package
La struttura aggiornata del nostro package è la seguente:
myAppSerial/
l00_start.py
l01_startGtk.py
my00init.py
myAppSerial.py
myLib/
__init__.py
myProtocol/
__init__.py
my00init.py
myProtocol.py
mySerial.py
Per scaricare la nuova versione 20150911.zip
Saluti
Bene nel prossimo post arricchiremo la nostra applicazione con altre caratteristiche.
Ciao alla prossima. (stay tune!)