2013-02-26 2 views
1

나는 키퍼를 사용하여 타이머를 시작하거나 멈추고 싶다는 테스트 케이스를 가지고 있지만 루틴을 유지하는 방법을 알 수는 없다 ... 'g' 타이머를 시작하고 계속 반복하십시오. 's'는 타이머를 중지해야합니다. 'g'는 타이머 등을 시작할 수 있습니다. 대신 'g'는 타이머를 시작하고 's'는 아무것도하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?명령 줄을 통한 조건부 키 누르기

코드 :

#!/usr/bin/env python 

import time, sys 

def print_something(status): 
    while(status): 
     print 'the time: ' , time.ctime() 
     time.sleep(1); 

def main(): 
    result = 1 
    print 'starting time: ' , time.ctime() 

    result = raw_input('press g to start timer, s to stop.\n') 
    while(result is 'g'): 
     print_something(True) 
     result = '' 

    result = None 
    time.stop() 

main() 
+0

무엇이 문제입니까? – PALEN

+0

문제는 이제 질문에서보다 철저하게 설명됩니다. – jml

답변

1

주요 문제는 stdin에서 읽으려고하고 있지만 제어 흐름이 print_something 함수 (이 경우 무한 루프)에 걸려 있고 거기에서 떠나지 않는다는 것입니다. 즉, 사용자가 입력 할 때 's'를 읽길 원하지만 루프가 끝날 때까지 코드의 해당 부분은 실행되지 않습니다.

중단이 필요합니다.. 다음 코드는 원하는 것을 수행하지만, 사용자는 "Ctrl + C"를 눌러 타이머를 중지해야합니다.


#!/usr/bin/env python 

import time, sys 

def main(): 
    result = 1 
    print 'starting time: ' , time.ctime() 

    while(result): 
     result = raw_input('press g to start timer, ctrl+c to stop.\n') 

     if result is 'g': 
      print_something() 
      result = '' 
     else: 
      result = None 
      time.stop() 
      sys.exit() 

def print_something(): 
    while 1: 
     try: 
      print 'the time: ' , time.ctime() 
      time.sleep(1); 
     except KeyboardInterrupt:    
      break 
main() 
는 편집 :
여기

내가 원하는 무엇 : 1. 프로그램 2. 히트 g을, 타이머 타이머 4. 히트 g, 타이머를 중지 3. 히트의 시작 CTRL-C는 이 타이머를 멈추게해서는 안되며, 오히려 프로그램을 죽이는 방법이되어서는 안됩니다.

프로그래밍 패러다임이 변경되어야합니다. 키 누르기와 같은 이벤트에 응답하는 Event-driven program을 생각하고 있습니다. 아마도 스레드을 만들어야하며 다른 스레드가 시간을 인쇄하는 동안 s 또는 g을 눌렀을 때 어떤 키를 눌렀 는가에 따라 동작합니다.

+0

좋아요, sys.exit()을 호출하고 싶지는 않지만 타이머를 멈추기 만하면됩니다. 나는 그것을 시도하고 다시는 방해 할 수 없다. 이것이 내가 풀려고하는 문제의 핵심입니다. – jml

+0

@jml 위의 코드에서'sys.exit()'줄을 지우면 타이머가 멈추고 거기에서 실행될 코드를 더 추가 할 수 있습니다 – PALEN

+0

@jml 그런 다음'else :'를'elif result is 's' :'그리고'sys.exit()'명령 줄에서's'를 얻은 후에 만 ​​수행합니다 (Ctrl-C를 누른 후에) – askewchan

-1

main 기능의 내부에 while 루프를 옮겨보십시오.

def main(): 
result = 1 
print 'starting time: ' , time.ctime() 
while(result): 
result = raw_input('press g to start timer, s to stop.\n') 

if result is 'g': 
    print_something() 
    result = '' 
elif result is 's': 
    result = None 
    time.stop() 
    sys.exit() 

업데이트 : 당신이 while(result != 's')에 대한 테스트를 시도?

+0

나는 이것을 시도했지만 코드는 실행되지 않는다. 내 질문을 업데이트 할게. – jml