2013-04-18 31 views
7

Bir signe karakterini okumak için EcDse ile birlikte Eclipse'de msvcrt.getch() kullanmak istedim ancak çalışmadığını öğrendim (ancak Windows konsolunda çalışıyor).Eclipse/PyDev'de msvcrt.getch() işlevini kullanma

Ne yapılacağı hakkında bir fikriniz var mı?

+0

gerçekten mümkün değildir: Windows konsolunda çalıştırdığınızda Fakat programın standart girdi, sonra başka bir programın standart çıktısını sys.stdin.read değil msvcrt.getch ile okunan sys.stdin.isatty döner False ve giriş yöneltilen eğer. Bakınız: https://stackoverflow.com/a/46303939/110451 –

cevap

2

Belki PyDev'de çalışırken sys.stdin.read kullanın? sys.stdin.read(1) gibi girişten 1 satır oku ... Windows konsolunda ve PyDev'de kullanmak, os ve run türevlerine göre aynı seçimi yapar (sys.stdin.isatty kullanarak). Örneğin bir sonraki kod, zaman ayarlı kullanıcı girdisini okur.

import sys, time 
import platform 
if platform.system() == "Windows": 
    import msvcrt 
else: 
    from select import select 

def input_with_timeout_sane(prompt, timeout, default): 
    """Read an input from the user or timeout""" 
    print prompt, 
    sys.stdout.flush() 
    rlist, _, _ = select([sys.stdin], [], [], timeout) 
    if rlist: 
     s = sys.stdin.readline().replace('\n','') 
    else: 
     s = default 
     print s 
    return s 
def input_with_timeout_windows(prompt, timeout, default): 
    start_time = time.time() 
    print prompt, 
    sys.stdout.flush() 
    input = '' 
    read_f=msvcrt.getche 
    input_check=msvcrt.kbhit 
    if not sys.stdin.isatty(): 
     read_f=lambda:sys.stdin.read(1) 
     input_check=lambda:True 
    while True: 
     if input_check(): 
      chr_or_str = read_f() 
      try: 
       if ord(chr_or_str) == 13: # enter_key 
        break 
       elif ord(chr_or_str) >= 32: #space_char 
        input += chr_or_str 
      except: 
       input=chr_or_str 
       break #read line,not char...   
     if len(input) == 0 and (time.time() - start_time) > timeout: 
      break 
    if len(input) > 0: 
     return input 
    else: 
     return default 

def input_with_timeout(prompt, timeout, default=''): 
    if platform.system() == "Windows": 
     return input_with_timeout_windows(prompt, timeout, default) 
    else: 
     return input_with_timeout_sane(prompt, timeout, default) 

print "\nAnswer is:"+input_with_timeout("test?",10,"no input entered")