Re: [Python] Gestione tastiera in un loop
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
[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
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
[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
-- 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
[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
[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
[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