2016-09-01 3 views
3

질문은 입력을 기다리는 동안 또는 입력을 기다리는 동안 stdin.readline 함수를 업데이트하는 프롬프트를 표시하는 것입니다. 예 : HH : MM : SS 형식의 시간이 포함되어 있고 매 초마다 새로 고치기 :파이썬에서 입력을 기다리는 동안 업데이트 프롬프트를 표시하는 방법은 무엇입니까?

while 1: 
    sys.stdout.write('\r' + time.strftime(TIME_FORMAT) + ' :>') 
    time.sleep(1.0) 

그러나 입력을 추가하자마자 프로그램은 입력을 쓸 때까지 기다립니다. 내가 사용하고있는 파이썬 버전은 3.5이다.

필자는 curses를 사용해야한다는 것을 알고 있지만, 크로스 플랫폼 프로그램을 작성하려고하고 있으며 발견 한 유일한 모듈은 clint이지만 업데이트 프롬프트의 설명서에는 아무 것도 없습니다.

def input_thread(L): 
    x = input() 
    L.append(x) 

L = [] 
thread = threading.Thread(target=input_thread, args=(L,)) 
thread.start() 
while 1: 
    sys.stdout.write('\r' + time.strftime(TIME_FORMAT) + '>:') 
    time.sleep(1.0) 
    sys.stdout.flush() 

지금 문제가 해결되지

는 당신이 입력을 입력하지만, 다음 반복 남아에, ENTER 입력을 누르지 않을 때하지만 때입니다 :

나는 꽤 사랑 받고 있지만, 다른 문제가있는 것을 발견 당신이 뭔가를 쓰면, 이전 입력은 현재 입력으로 대체됩니다. 물론 이전 입력 값은 인수 L에 여전히 있으므로 입력이 손실되지 않습니다. 나는 이것을 혼란스럽게 생각하지 않기를 바란다.

저주로 할 수있는 것처럼 쉬운 방법이 없다면 비슷한 크로스 오픈 도구를 사용할 수 있습니다. 시간과 답변에 감사드립니다!

+0

변수에'L' 상태를 저장하고 "what changed!"에 대한'while' 루프를 확인하십시오. – dsgdfg

+0

@dsgdfg 어쩌면 구체적이지 않았습니다. 내가 입력 한 내용을 처리 할 수 ​​있습니다. 문제는 프롬프트가 새로 고침 될 때마다 입력하지 않고 입력 한 입력이 사라진다는 것입니다. 이전 반복에서 발생한 결과를 인쇄하면 문자열은 항상 명령 줄에서 시각적으로 표시됩니다. – simicg

+0

함께 작업하는 경우 (동일한주기에서) 스레드가 필요하지 않습니다. 그렇지 않으면 추가 이벤트를 위해 일시 ​​중지/잠금 스레드가 필요합니다. – dsgdfg

답변

0

그래서 몇 달 전에 원했던 것을 알아 냈지만 내 자신의 질문에 대답하지 않았습니다.

  1. 업데이트 추가 입력
  2. 캐치 키 스트로크 프롬프트가

두 번째 스레드가 모든 키를 처리합니다

시간을 업데이트하는 프롬프트를하려면 별도의 스레드를 필요 - 스트로크를 사용하면 누른 키를 처리하는 방법을 프로그래밍 할 수 있습니다.

키를 누르면 프롬프트를 업데이트하는 스레드가 누른 키를 추가합니다. 또한 Return, Backspace 등의 일부 바로 가기를 구성하여 예상대로 작동해야합니다.

불행히도 작동하지 않아 ... 좋지 않습니다. 누구나 내가 행복하게 제공 할 코드를보고 싶다면.

관련 문제