2013-04-18 42 views
7

Tôi muốn sử dụng msvcrt.getch() trong Eclipse với PyDev để đọc một ký hiệu char nhưng tôi phát hiện ra rằng nó không hoạt động (nhưng nó hoạt động trong giao diện điều khiển Windows).Sử dụng msvcrt.getch() trong Eclipse/PyDev

Bất kỳ ý tưởng nào cần làm?

+0

Đó không phải là thực sự tốt. Xem: https://stackoverflow.com/a/46303939/110451 –

Trả lời

2

Có thể sử dụng sys.stdin.read khi chạy trong PyDev? như sys.stdin.read(1) đọc 1 dòng từ đầu vào ... Để sử dụng trong giao diện điều khiển Windows và trong PyDev, hãy thực hiện lựa chọn tương tự dựa trên các biến thể chạy và chạy (sử dụng sys.stdin.isatty). Ví dụ mã tiếp theo đọc đầu vào người dùng được giới hạn thời gian. Nhưng khi chạy trong Windows console nếu đầu vào tiêu chuẩn của chương trình được cấp nước tập trung với đầu ra tiêu chuẩn của một chương trình khác, sau đó trở về sys.stdin.isattyFalse và đầu vào đọc với sys.stdin.read, không msvcrt.getch:

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")