2012-08-02 2 views
5

사용자가 20 초 동안 아무 키나 누를 때까지 기다릴 수 있습니까? 나는. 메시지를 보여 주며 20 초를 카운트합니다. 코드는 20 초가 경과되거나 사용자가 아무 키를 누르면 실행을 계속합니다. 파이썬으로 어떻게 할 수 있습니까?사용자가 어떤 키를 누르기까지 20 초 동안 기다리는 방법?

+2

에서 촬영 한 while 루프에서 시작 시간과 비교하여 현재 시간을 확인합니다. – Lanaru

+1

@ 라 나루 : while while loop? 바쁜 대기의 나쁜 경우 인 것 같습니다. 타임 아웃과 함께'select()'와 같은 것은 같은 일을 할 수 있습니다. – gsk

+0

_ 임의의 키를 누르는 것은 같지 않습니다 _input 모든 문자열 _ – moooeeeep

답변

7

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 
+0

조금 사소하지만 누군가가 캐릭터를 친다면 수면, 너는 아무 이유없이 기다리고있어. 수면보다 시간을 비교하는 것이 가장 좋습니다. – Logan

+0

네 말이 맞아. 시간을 비교하도록 업데이트되었습니다. –

0

(경고 : 테스트되지 않은 코드)

뭔가 같은 :

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" 

편집 참조 : http://docs.python.org/library/select.html

+1

select 모듈에 대해 알지 못했습니다. 알고있는 것이 좋습니다. 방금 창문에서 테스트 해봤는데 작동하지 않았습니다. 문서에서 : 참고 : Windows의 파일 개체는 허용되지 않지만 소켓은 있습니다. Windows에서 기본 select() 함수는 WinSock 라이브러리에서 제공되며 WinSock에서 시작하지 않은 파일 설명자를 처리하지 않습니다. –

+0

@BrendenBrown : 와우, 나는 몰랐다. 업데이트 해 주셔서 감사합니다 (Windows 개발에 대한 혼란이 더해집니다 ...) – gsk

2

한 가지 해결책은을 사용하는 것입니다.값을 확인하려고하지만 맘에 안 든다. 내 시간을 낭비하고있는 것처럼 느껴진다.
반면에 Linux 시스템에서 신호를 사용하여 문제를 처리 할 수 ​​있습니다. 일정 시간 후, 계산 한 예외가 발생 될 것이다 try 실패하고 코드 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 '' 

코드는 실행 한 후, 비 - 블로킹 입력 찾아 here

+0

나는이 하나가 마음에 들어하지만 Windows에서도 작동하지 않습니다. – mgilson

+0

또한 특별한 경우에는'raw_input'이 끝에'\ n'을 입력 할 때까지 기다리는 또 다른 함정이 있습니다. 파이썬은 기본적으로 라인 버퍼 모드에 있기 때문입니다. – Rsh

관련 문제