Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread Daniele Zambelli
On Wednesday 25 June 2008 11:38:40 [EMAIL PROTECTED] wrote:
> Scusate la domanda forse sciocca ma sono ancora poco ferrarto in python
>
> Ho questo loop che legge di continuo i dati proveninti dalla porta seriale
>
> while 1:
> ReadComm = PhoneProfile.SerialPort.readline()
> if ReadComm!='':
> print ReadComm
>

Mettere un break dopo il print?

Ciao

-- 

Danielewww.fugamatematica.blogspot.com

  giusto!
  _o)  (o_   (o_ _o)  nel verso
-./\\  //\.- //\ /\\  forse è perché non guardiamo le cose
 _\_V  V_/_  V_/ \_V  Quando non ci capiamo,
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread Manlio Perillo
[EMAIL PROTECTED] ha scritto:
> Scusate la domanda forse sciocca ma sono ancora poco ferrarto in python 

Ciao.

Innanzitutto dovresti indicare che piattaforma stai usando, spesso è 
fondamentale saperlo.

>  
> Ho questo loop che legge di continuo i dati proveninti dalla porta seriale
>  
> while 1:
> ReadComm = PhoneProfile.SerialPort.readline()
> if ReadComm!='':
> print ReadComm
>  
> Ho guardato la guida "pensare informatico" e sul web ma non riesco a 
> capire come inserire in questo loop una funzione che mi consenta di 
> uscire se premo un tasto
>  

Ci sono due soluzioni.
Quella più portabile è usare un thread separato che controlla lo stato 
della tastiera.

Come controllare questo stato dipende dal sistema operativo.

Un altra soluzione è usare l'I/O multiplexing (select per intenderci).
Questa soluzione è possibile anche su Windows ma l'API è molto diversa 
da quella disponibile su sistemi UNIX.


> Grazie
>  


Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread farolfo
Grazie per le risposte. Lo script per ora lo sto testando in windows e mac 
os x. Vorrei poterlo poter far girare anche su linux, ma purtropo per ora 
sto traslocando e non ho accesso per un po di giorni al pc dove ho 
installato questo os

avevo trovato in giro questo esempio ma nn fa niente

while 1:
try:
ReadComm = PhoneProfile.SerialPort.readline()
if ReadComm!='':
print ReadComm
except KeyboardInterrupt:
print "Uscita in corso, bye..."
ExitToOS()

grazie luca

--
From: "Manlio Perillo" <[EMAIL PROTECTED]>
Sent: Thursday, June 26, 2008 11:14 AM
To: "Discussioni generali sul linguaggio Python" 
Subject: Re: [Python] Gestione tastiera in un loop

> Ci sono due soluzioni.
> Quella più portabile è usare un thread separato che controlla lo stato
> della tastiera.
>
> Come controllare questo stato dipende dal sistema operativo.
>
> Un altra soluzione è usare l'I/O multiplexing (select per intenderci).
> Questa soluzione è possibile anche su Windows ma l'API è molto diversa
> da quella disponibile su sistemi UNIX.
>
>
>> Grazie
>>
>
>
> Manlio Perillo
 

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread Manlio Perillo
[EMAIL PROTECTED] ha scritto:
> Grazie per le risposte. Lo script per ora lo sto testando in windows e mac 
> os x. Vorrei poterlo poter far girare anche su linux, ma purtropo per ora 
> sto traslocando e non ho accesso per un po di giorni al pc dove ho 
> installato questo os
> 

Ma stai usando .NET?
In questo caso non posso aiutarti, non lo conosco.

> avevo trovato in giro questo esempio ma nn fa niente
> 
> while 1:
> try:
> ReadComm = PhoneProfile.SerialPort.readline()
> if ReadComm!='':
> print ReadComm
> except KeyboardInterrupt:
> print "Uscita in corso, bye..."
> ExitToOS()
> 

Ti consiglio di cominciare a leggere un tutorial su Python.
Questo codice intercetta un interrupt da tastiera (quando premi CTRL-C) 
non la pressione di un tasto qualsiasi.

> grazie luca
> 


Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread farolfo
--
From: "Manlio Perillo" <[EMAIL PROTECTED]>
Sent: Thursday, June 26, 2008 12:28 PM
To: "Discussioni generali sul linguaggio Python" 
Subject: Re: [Python] Gestione tastiera in un loop

> [EMAIL PROTECTED] ha scritto:
>
> Ma stai usando .NET?
> In questo caso non posso aiutarti, non lo conosco.

non uso .net e non lo o neanche usare :) Uso python 2.5 e PyScripter per 
l'edit in Windows e ScrIDE in MacOS

>
> Ti consiglio di cominciare a leggere un tutorial su Python.
> Questo codice intercetta un interrupt da tastiera (quando premi CTRL-C)
> non la pressione di un tasto qualsiasi.

Ho letto "Pensare da informatico" di Allen B. Downey, Jeffrey Elkner e Chris 
Meyers, pensavo intercettare la pressione dei tasti fosse una cosa più 
semplice da fare, cmq seguiro i vostri consigli e mi documenterò meglio. 
Visto che cmq dovrei dotare il programma anche di un interfaccia grafica 
vedro se le gui disponibili hanno queste funzioni.

grazie

Luca 

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread Manlio Perillo
[EMAIL PROTECTED] ha scritto:
> --
> From: "Manlio Perillo" <[EMAIL PROTECTED]>
> Sent: Thursday, June 26, 2008 12:28 PM
> To: "Discussioni generali sul linguaggio Python" 
> Subject: Re: [Python] Gestione tastiera in un loop
> 
>> [EMAIL PROTECTED] ha scritto:
>>
>> Ma stai usando .NET?
>> In questo caso non posso aiutarti, non lo conosco.
> 
> non uso .net e non lo o neanche usare :) Uso python 2.5 e PyScripter per 
> l'edit in Windows e ScrIDE in MacOS
> 

PhoneProfile.SerialPort sembra provenire da .NET.
Che package stai usando per comunicare con la seriale?

>> Ti consiglio di cominciare a leggere un tutorial su Python.
>> Questo codice intercetta un interrupt da tastiera (quando premi CTRL-C)
>> non la pressione di un tasto qualsiasi.
> 
> Ho letto "Pensare da informatico" di Allen B. Downey, Jeffrey Elkner e Chris 
> Meyers, pensavo intercettare la pressione dei tasti fosse una cosa più 
> semplice da fare, cmq seguiro i vostri consigli e mi documenterò meglio. 

E' abbastanza semplice, se hai un pò di esperienza.
Il problema è che l'unica cosa che è possibile fare in modo portabile è 
leggere una riga completa dalla console.

Ossia, se fai:
sys.stdin.read()

questa funziona ritorna solo dopo che l'utente preme il tasto [invio].

Per gestire un singolo tasto devi usare codice che dipende dalla 
piattaforma.


Eccoti due funzioni, per sistemi POSIX (Linux, OS X) e Windows.
Le due funzioni non sono equivalenti al 100%:


def posix_getch():
 "Si protrebbe usare direttamente tty.setcbreak() ma non c'è una
 funzione per ripristinare la modalità normale.
 """

 import termios, sys

 fd = sys.stdin.fileno()
 old = termios.tcgetattr(fd)
 new = termios.tcgetattr(fd)
 new[3] = new[3] & ~(termios.ECHO | termios.ICANON)  # lflags

 try:
 termios.tcsetattr(fd, termios.TCSAFLUSH, new)
 ch = sys.stdin.read(1)
 finally:
 termios.tcsetattr(fd, termios.TCSAFLUSH, old)

 return ch

def win_getch():
 import msvcrt

 return getch()


Queste due funzioni non ti bastano.
Quando fai:
PhoneProfile.SerialPort.readline()

la funzione non ritorna fino a quando non ha letto una riga completa 
dalla seriale.

Invece tu hai bisogno di monitorare sia la seriale che lo stdin allo 
stesso tempo.

Questo è un esempio di programmazione concorrente, non proprio banale.

Ci sono diverse soluzioni, la più elegante ed efficiente è usare l'IO 
multiplexing e non bloccante, ma avresti problemi ad implementarlo in 
modo semplice su Windows.

Quindi ti consiglio di usare un thread separato in cui fai:

def thread_main():
# blocca fino a quanto non viene premuto un tasto
getch()

# lancia un KeybordInterrupt nel thread principale
thread.interrupt_main()


In questo modo non devi modificare la struttura nel tuo codice 
principale, anche se questa soluzione è abbastanza limitata.

> Visto che cmq dovrei dotare il programma anche di un interfaccia grafica 
> vedro se le gui disponibili hanno queste funzioni.
> 

Con una GUI le cose si complicano, cerca di fare un passo alla volta.

> grazie
> 
> Luca 
> 


Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread farolfo
[EMAIL PROTECTED] ha scritto:

>
> PhoneProfile.SerialPort sembra provenire da .NET.
> Che package stai usando per comunicare con la seriale?
>
Uso pySerial solo che PhoneProfile é una classe che sto buttando giù per 
gestire il modem GSM e SerialPort é definito così nella classe:

self.SerialPort= serial.Serial(self.CommPort)

CommPort é il nome della seriale,a d esempio COM8 su Windows oppure 
/dev/cu.telefonoBT su Mac

> E' abbastanza semplice, se hai un pò di esperienza.

il problema é questo :) ma sto imparando

> Invece tu hai bisogno di monitorare sia la seriale che lo stdin allo
> stesso tempo.
>
> Questo è un esempio di programmazione concorrente, non proprio banale.
>

Infatti sto studiando anche i thread, vengo da vb6 ed in questo ambiente non 
esistono proprio, devi fare tutto tramite i timer in quanto nel runtime di 
vb quando crei un timer viene gestito dalla macchina virtuale come un thrad 
separato e quindi ha un comportamento che gli si avvicina abbastanza anche 
se molto più limitato nelle funzioni.

Grazie cmq per le dritte  :)

Luca

 

___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python


Re: [Python] Gestione tastiera in un loop

2008-06-26 Thread Manlio Perillo
[EMAIL PROTECTED] ha scritto:
> [EMAIL PROTECTED] ha scritto:
> 
>> PhoneProfile.SerialPort sembra provenire da .NET.
>> Che package stai usando per comunicare con la seriale?
>>
> Uso pySerial solo che PhoneProfile é una classe che sto buttando giù per 
> gestire il modem GSM e SerialPort é definito così nella classe:
> 
> self.SerialPort= serial.Serial(self.CommPort)
> 

Ok.
Ma ti consiglio di non usare nomi di variabili che cominciano con una 
lettera maiuscola:
http://www.python.org/dev/peps/pep-0008/


 > [...]


Manlio Perillo
___
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python