You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.5 KiB
75 lines
1.5 KiB
# Code from https://github.com/johejo/inputimeout/ |
|
import sys |
|
|
|
DEFAULT_TIMEOUT = 30.0 |
|
INTERVAL = 0.05 |
|
|
|
SP = ' ' |
|
CR = '\r' |
|
LF = '\n' |
|
CRLF = CR + LF |
|
|
|
|
|
class TimeoutOccurred(Exception): |
|
pass |
|
|
|
|
|
def echo(string): |
|
sys.stdout.write(string) |
|
sys.stdout.flush() |
|
|
|
|
|
def posix_inputimeout(prompt='', timeout=DEFAULT_TIMEOUT): |
|
echo(prompt) |
|
sel = selectors.DefaultSelector() |
|
sel.register(sys.stdin, selectors.EVENT_READ) |
|
events = sel.select(timeout) |
|
|
|
if events: |
|
key, _ = events[0] |
|
return key.fileobj.readline().rstrip(LF) |
|
else: |
|
echo(LF) |
|
termios.tcflush(sys.stdin, termios.TCIFLUSH) |
|
raise TimeoutOccurred |
|
|
|
|
|
def win_inputimeout(prompt='', timeout=DEFAULT_TIMEOUT): |
|
echo(prompt) |
|
begin = time.monotonic() |
|
end = begin + timeout |
|
line = '' |
|
|
|
while time.monotonic() < end: |
|
if msvcrt.kbhit(): |
|
c = msvcrt.getwche() |
|
if c in (CR, LF): |
|
echo(CRLF) |
|
return line |
|
if c == '\003': |
|
raise KeyboardInterrupt |
|
if c == '\b': |
|
line = line[:-1] |
|
cover = SP * len(prompt + line + SP) |
|
echo(''.join([CR, cover, CR, prompt, line])) |
|
else: |
|
line += c |
|
time.sleep(INTERVAL) |
|
|
|
echo(CRLF) |
|
raise TimeoutOccurred |
|
|
|
|
|
try: |
|
import msvcrt |
|
|
|
except ImportError: |
|
import selectors |
|
import termios |
|
|
|
inputimeout = posix_inputimeout |
|
|
|
else: |
|
import time |
|
|
|
inputimeout = win_inputimeout
|
|
|