Pagina 1 di 1
python - intercettare la pressione di un tasto
Inviato: giovedì 27 marzo 2014, 8:25
da maresama
In un programma c'è una pesante elaborazione di file. Vorrei fare in maniera che, premendo un qualsiasi tasto (anche del mouse) il programma chiedesse se deve proseguire o se deve interrompere (alla fine dell'elaborazionbe della cartella) per fare un'altra operazione , alla fine della quale riprendere il lavoro dalla cartella successiva.
Come si può intercettare l'uso di un tasto?
Grazie...
Re: python - intercettare la pressione di un tasto
Inviato: giovedì 27 marzo 2014, 15:11
da vaeVictis
Re: python - intercettare la pressione di un tasto
Inviato: giovedì 27 marzo 2014, 18:30
da maresama
Grazie per la risposta.
Non ho capito bene come fare per intercettare qualunque tasto....
Cercherò di capire di più appena ho un po' di tempo libero. Mi sembra comunque la strada giusta.
Ciao.
Re: python - intercettare la pressione di un tasto
Inviato: giovedì 27 marzo 2014, 18:51
da vaeVictis
La tua richiesta è leggermente differente te da quella cui è indirizzata la mia risposta.
Credevo che per qualsiasi tasto stessi esprimendo in modo vago la gestione della interrupt.
Appena sono dal PC, ti scrivo più nel dettaglio.
Re: python - intercettare la pressione di un tasto
Inviato: giovedì 27 marzo 2014, 19:07
da Claudio_F
Se l'interfaccia è una GUI è banale, altrimenti per la shell ci sono un po'di cose interessanti googlando "getch in Python".
Re: python - intercettare la pressione di un tasto
Inviato: giovedì 3 aprile 2014, 15:31
da kimj
credo serva settare il terminale in modalità non canonica:
http://stackoverflow.com/a/358381
il comando unix è 'stty -icanon', in python puoi usare la libreria termios:
https://docs.python.org/2/library/termios.html
modifico leggermente l'esempio della documentazione python (che non controlla per lo stato precedente di ICANON). conta che qualcosa di simile si può ottenere più semplicemente con il modulo 'tty', invocando tty.setraw(fd)
faccio un esempio dove esci dal loop quando l'utente preme il tasto Y (senza dover premere invio) od il tasto N (in questo caso ritornando False), quale dei due avviene prima.
Codice: Seleziona tutto
import termios, sys
def prova():
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
new = termios.tcgetattr(fd)
new[3] = new[3] & ~termios.ICANON # lflags
print "Premi Y per confermare, N per annullare "
try:
termios.tcsetattr(fd, termios.TCSADRAIN, new)
ch = 0
while (ch != 'Y') and (ch != 'N'):
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
if ch == 'Y':
print "\nHai confermato premendo Y"
return True
else:
print "\nHai annullato premendo N"
return False
(ovviamente se vuoi input 'in real time' senza che l'utente prema invio non basta soltanto cambiare il terminale in modalità non canonica, ma bisogna emulare 'getchar': raw_input non va bene. devi entrare, impostato il terminale in modalità non canonical, in un loop dove leggi i singoli caratteri con sys.stdin.read(1))
Re: python - intercettare la pressione di un tasto
Inviato: martedì 15 aprile 2014, 23:51
da maresama
Grazie per la risposta ma confesso che non mi è chiaro.
Immaginiamo di avere un programma che legga 100 file, così fatto:
n=0
while n< 100:
.... leggi file....
.... elabora....
n+=1
Per interromperlo premendo un tasto (in qualunque momento ma interrompendo solo a fine elaborazione di un file), come dovrei fare?
Le istruzioni dell'esempio come le inserisco?
Grazie..
Re: python - intercettare la pressione di un tasto
Inviato: mercoledì 16 aprile 2014, 14:56
da kimj
puoi estendere il ciclo di while che conta sino a 100 aggiungendo and (ch != 'N') e poi ottenendo 'ch' nel ciclo, od uscendo controllandolo con un if dopo averlo ottenuto, usando break.
il problema e' che rimarresti ad attendere la pressione di un tasto, qualsiasi esso sia, prima di continuare il ciclo, quindi o imposti una try con un timeout ragionevole, o devi usare un thread separato per l'input...
Re: python - intercettare la pressione di un tasto
Inviato: mercoledì 16 aprile 2014, 22:37
da maresama
Ora credo di avere le idee più chiare.
Farò un programmino di prova
Grazie. Ciao..