Come posso aspettare che l'utente preme un tasto per 20 secondi? Cioè Io mostro il messaggio e conta 20 secondi, il codice continua l'esecuzione se vengono passati 20 secondi OPPURE se l'utente ha premuto un tasto qualsiasi. Come posso farlo con Python?Come aspettare 20 secondi per l'utente per premere un tasto?
risposta
Se siete su Windows:
def wait_for_user(secs):
import msvcrt
import time
start = time.time()
while True:
if msvcrt.kbhit():
msvcrt.getch()
break
if time.time() - start > secs:
break
È un po 'meschino, ma se qualcuno colpisce un personaggio durante il sonno, stai aspettando senza motivo. Meglio confrontare il tempo piuttosto che dormire. – Logan
Hai ragione. Aggiornato per confrontare il tempo. –
(Attenzione: codice non testato)
Qualcosa di simile:
import sys
import select
rlist, _, _ = select.select([sys.stdin], [], [], timeout=20)
if len(rlist) == 0:
print "user didnt input anything within 20 secs"
else:
print "user input something within 20 secs. Now you just have to read it"
modificare vedi: http://docs.python.org/library/select.html
Non sapevo del modulo di selezione, è bello sapere. L'ho appena testato su Windows e non ha funzionato. Da documenti: Nota: gli oggetti file su Windows non sono accettabili, ma i socket sono. Su Windows, la funzione select() sottostante è fornita dalla libreria WinSock e non gestisce i descrittori di file che non provengono da WinSock. –
@BrendenBrown: Wow, non ne avevo idea. Grazie per l'aggiornamento (questo promuove la mia confusione allo sviluppo di Windows ...) – gsk
Una possibile la soluzione è usare select
per verificare i valori, ma non mi piace, mi sento come se stessi perdendo il mio tempo.
D'altra parte è possibile utilizzare la segnalazione su sistemi Linux per gestire il problema. dopo un certo periodo di tempo, un'eccezione viene sollevata, try
fallisce e codice continua in except
:
import signal
class AlarmException(Exception):
pass
def alarmHandler(signum, frame):
raise AlarmException
def nonBlockingRawInput(prompt='', timeout=20):
signal.signal(signal.SIGALRM, alarmHandler)
signal.alarm(timeout)
try:
text = raw_input(prompt)
signal.alarm(0)
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal(signal.SIGALRM, signal.SIG_IGN)
return ''
Il codice è stato preso da here
- 1. Come convertire un tasto Invio Premere un tasto Tasto Premere per le pagine Web
- 2. Come codificare "premere il tasto per continuare"
- 3. Chiamare una funzione javascript dopo 5 secondi dell'ultimo tasto premere
- 4. Permetti solo 1 valore per tasto premere
- 5. Premere un tasto con Java
- 6. Come sospendere il thread corrente per 20 secondi in java?
- 7. Come aspettare 5 secondi con jQuery?
- 8. tasto di manipolazione premere il tasto
- 9. Come funziona '20 secondi 'in Scala?
- 10. Android - Premere il tasto tastiera
- 11. RubyMine: premere il tasto per "convertire in virgolette"?
- 12. Come fare "premere un tasto qualsiasi" in python?
- 13. c'è un modo per utilizzare l'input ("Premere qualsiasi tasto per continuare") sulla versione 2.6
- 14. ReactJs: Prevenire più volte premere il tasto
- 15. Come posso rilevare se "Premere un tasto qualsiasi per continuare ...". sarà mostrato?
- 16. Bind TextBox su tasto Invio premere
- 17. Simula tasto Tab Premere in iOS SDK
- 18. Attivazione di un evento della tastiera premendo un tasto senza premere il tasto dalla tastiera
- 19. Qual è il modo migliore per aspettare un certo tempo (diciamo 10 secondi) in C#?
- 20. Come verificare se datetime è più vecchio di 20 secondi
- 21. Qual è il modo più efficiente per chiamare un metodo ogni 20 secondi
- 22. Come ascoltare il tasto Ctrl-P premere in JavaScript?
- 23. C'è un modo per ottenere l'input dell'utente senza premere il tasto Invio?
- 24. Uso di jQuery 'on()' per guardare per inserire il tasto premere
- 25. Come acquisire Premere il tasto Invio in GtkEntry
- 26. Come si fa a premere l'ultimo tasto freccia usando curses?
- 27. Premere Invio per continuare
- 28. Visual Studio 2010 "Premere un tasto qualsiasi per continuare ..." non mostra
- 29. listener per premere e rilasciare un pulsante
- 30. Android: Come premere il tasto sopra la tastiera virtuale
Consulti non bloccante ingresso, poi attuare tale in un ciclo while che controlla l'ora corrente rispetto all'orario di partenza. – Lanaru
@Lanaru: perché un ciclo? Sembra un brutto caso di busy-waiting. Qualcosa come 'select()' con un timeout potrebbe fare la stessa cosa. – gsk
_press qualsiasi chiave_ non è uguale _input any string_ – moooeeeep