2017-11-06 31 views
2

10 초마다 문장 "Hello World"를 인쇄해야합니다. 그러나 사용자가 'c'또는 'Enter'중 하나 인 경우 프로그램은 문장 인쇄를 중지하고 사용자에게 다른 문장을 제공하라는 메시지를 표시해야합니다. 사용자 제공 문장이 검사되고 문장에 숫자가 포함되어 있으면 "숫자를 포함 할 수 없습니다"라는 메시지가 나타납니다. 그렇지 않으면 "올바른 문장"이라는 메시지가 나타납니다. 두 메시지 중 하나를 표시 한 후 프로그램은 "Hello World"인쇄를 계속합니다.Python : 특정 키 누르기를 감지하고 사용자에게 묻습니다.

다음은 내가 언급 한 코드입니다. 어떻게 더 나아갈 지에 대한 어떤 힌트라도 크게 감사 할 것입니다. 감사합니다.

import threading 

def looping(): 
    threading.Timer(10.0, looping).start() 
    print("Hello World!") 

looping() 
+1

이상한 할당 ..... 어쨌든 10 초마다 "Hello world"부분없이 프로그램을 만들어보십시오. 그냥 보통의 input-if-else 구조체를 생성하면된다. 그게 작동하면, 타이머 일을 추가하십시오. 스레드와 콘솔 입출력이 잘 작동하지 않는다는 것을 알아 두십시오. –

답변

1

"Hello World"를 인쇄하기 위해 타이머를 사용하여 올바른 지시를받은 것처럼 보입니다. Irmen de Jong이 "스레드와 콘솔 입출력이 잘 작동하지 않는다"는 문항에 대한 질문에 대해 upvote를하고 싶습니다. C 프로그래밍에서이 경험을 직접 경험했기 때문입니다.

일단 타이머를 사용하면 화면에 인쇄되는 텍스트가 키보드 입력에 응답하지 않아야합니다. 실제로 키보드의 입력을 input()으로 읽을 때 'c'의 키 누르기 ('Enter'가 뒤 따르지 않음)에 직접 응답해야하는 경우, Python method for reading keypress?의 해결 방법 중 하나를 따르는 것이 좋습니다 어떻게 구현하고 싶은지 알아보십시오.

편집 : 스레드 기반 타이머를 사용하여 솔루션을 구현하는 것은 생각보다 조금 까다 롭습니다. 이 문제에 대한 당신의 연구에 발견 할 수 있습니다으로

threading.Timer 객체는 변수에 타이머에 대한 참조를 저장 한 경우 개별 스레드 타이머의 실행을 제어하는 ​​데 사용할 수있는 두 start()stop() 방법이있다 (예 : my_timer = threading.Timer(10.0, looping)을 수행 한 후 my_timer.start()을 호출하여 타이머를 시작하십시오). 이렇게하면 my_timer.stop()에 전화하여 해당 시점에 중지해야하는 현재 타이머 인스턴스에 대한 적절한 참조를 유지해야 루프를 일시 중지 할 수 있습니다.

내가, False로 설정하면, looping가 호출 될 때 이에 PAUSE_LOOPING 때까지 함수의 모든 추가 반복을 중지, 시작되는 새로운 타이머 인스턴스를 중지하는 글로벌 변수 PAUSE_LOOPING을 만들하기로 결정했습니다, 좀 더 쉽게 일을 만들려면 True 다시 설정되고 looping()는 다시 호출 : 마지막 코드 블록에서 주석

import threading 
from msvcrt import getch 

PAUSE_LOOPING = False 

def looping(): 
    global PAUSE_LOOPING 
    if not PAUSE_LOOPING: 
     threading.Timer(10.0, looping).start() 
     print("Hello World!") 

looping() 

while True: 
    # key = ord(getch()) 
    # if key == 13: # Enter 
    #  PAUSE_LOOPING = True 
    input_string = input() 
    if input_string == "": 
     PAUSE_LOOPING = True 
    else: 
     PAUSE_LOOPING = False 
     looping() 

이 (input()에서 요구하는대로 키를 '입력'누를 필요없이) 직접 키 누름을 잡기 위해 한 방법입니다 내 대답에 이전에 링크 된 stackoverflow 질문에서 가져온. 이 기능은 Windows 용 Python (MS VC++ 런타임 라이브러리 msvcrt이 설치되어 있으므로)을 사용하는 동안 작동하지만 'Enter'키를 누르면 스크립트가 중지되도록 표준 input() 기능을 사용할 수 있습니다. 필자의 예에서는 'Enter'키를 누르기 전에 다른 문자열을 입력하면 일시 중지 된 후 루핑이 재개됩니다.

참고 :이 코드를 실행하려면 Python의 IDLE을 사용하십시오. 그것은 작동하지 않습니다. 대신 명령 줄에서 실행해야합니다.

+0

지금은 사용자가 "Enter"버튼을 눌렀을 때 어떻게 현재 스크립트를 멈출 수 있는지 알아 내려고합니다. 내가 건너 갈 대부분의 해결책은 나의 경우가 아닌 의견을 요구한다. – Mooni

+0

문제가 조금 까다 롭습니다. 내 솔루션을 업데이트했습니다! 그것이 내 대답이라면 받아 들여주세요. :) – husby036