81 lines
1.5 KiB
Python
81 lines
1.5 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
|
||
|
"""
|
||
|
clone 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
|
||
|
|
||
|
|
||
|
inputimeout = None
|
||
|
|
||
|
try:
|
||
|
import msvcrt
|
||
|
|
||
|
except ImportError:
|
||
|
import selectors
|
||
|
import termios
|
||
|
|
||
|
inputimeout = posix_inputimeout
|
||
|
|
||
|
else:
|
||
|
import time
|
||
|
|
||
|
inputimeout = win_inputimeout
|