<p>下面是一个工作示例(<em>在Linux</em>上使用Python 3.8.6进行测试)。如果需要为其他系统修改,请参阅<a href="https://stackoverflow.com/a/510364/2974621">this</a>答案</p>
<p><code>hinput</code>函数在输入字符时读取字符,并为通过新字符和整行的每个新字符调用<code>on_char</code></p>
<p>在我的示例中,当用户键入<code>x</code>时<code>on_char</code>函数返回<code>True</code>,这会导致<code>hinput</code>函数停止等待新输入</p>
<p>如果用户键入<code>hello</code>,它将自动完成为<code>hello, world</code>,并终止<code>hinput</code></p>
<pre><code>import sys
import termios
import tty
from typing import Callable
def main():
hinput("prompt: ", on_char)
return 0
def on_char(ch: str, line: str) -> bool:
if ch == 'x':
sys.stdout.write('\n')
sys.stdout.flush()
return True
if line+ch == 'hello':
sys.stdout.write("%s, world\n" % ch)
sys.stdout.flush()
return True
return False
def hinput(prompt: str=None, hook: Callable[[str,str], bool]=None) -> str:
"""input with a hook for char-by-char processing."""
fd = sys.stdin.fileno()
old = termios.tcgetattr(fd)
inpt = ""
while True:
sys.stdout.write('\r')
if prompt is not None:
sys.stdout.write(prompt)
sys.stdout.write(inpt)
sys.stdout.flush()
ch = None
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd, termios.TCSADRAIN, old)
if hook is not None and hook(ch, inpt):
break
if ord(ch) == 0x7f: #BACKSPACE
if len(inpt) > 0:
sys.stdout.write('\b \b')
inpt = inpt[:-1]
continue
if ord(ch) == 0x0d: #ENTER
sys.stdout.write('\n')
sys.stdout.flush()
break
if ch.isprintable():
inpt += ch
return inpt
if __name__ == '__main__':
sys.exit(main())
</code></pre>