python - intercettare la pressione di un tasto

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

python - intercettare la pressione di un tasto

Messaggio 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...
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: python - intercettare la pressione di un tasto

Messaggio da vaeVictis »

Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: python - intercettare la pressione di un tasto

Messaggio 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.
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: python - intercettare la pressione di un tasto

Messaggio 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.
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
Claudio_F
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1463
Iscrizione: lunedì 28 maggio 2012, 18:49
Desktop: Mate/Gnome
Distribuzione: Ubu22.04

Re: python - intercettare la pressione di un tasto

Messaggio da Claudio_F »

Se l'interfaccia è una GUI è banale, altrimenti per la shell ci sono un po'di cose interessanti googlando "getch in Python".
:ciao:
Avatar utente
kimj
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1058
Iscrizione: sabato 13 settembre 2008, 11:45

Re: python - intercettare la pressione di un tasto

Messaggio 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))
We no longer think of chairs as technology; we just think of them as chairs. But there was a time when we hadn't worked out how many legs chairs should have, how tall they should be, and they would often 'crash' when we tried to use them.
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: python - intercettare la pressione di un tasto

Messaggio 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..
Avatar utente
kimj
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1058
Iscrizione: sabato 13 settembre 2008, 11:45

Re: python - intercettare la pressione di un tasto

Messaggio 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...
We no longer think of chairs as technology; we just think of them as chairs. But there was a time when we hadn't worked out how many legs chairs should have, how tall they should be, and they would often 'crash' when we tried to use them.
maresama
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1640
Iscrizione: mercoledì 9 gennaio 2008, 16:00

Re: python - intercettare la pressione di un tasto

Messaggio da maresama »

Ora credo di avere le idee più chiare.
Farò un programmino di prova
Grazie. Ciao..
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti