python - 当用户在 Python 中按下 Tab 时,如何获取用户输入?
问题描述
我一直在尝试找到一种方法来获取以用户按下 Tab 结尾的用户输入。我想要发生的是让用户输入注释,并且在他们按下 Tab 之前它不会完成输入。
我试图使用这种方法,但不知道该怎么做。
text = input()
我希望用户输入注释并能够在不完成输入的情况下按 Enter 进入新行。只有当用户按下 Tab 时,输入才会完成,文本才会存储到变量中。
解决方案
你所要求的听起来很简单,但不幸的是并不容易做到。问题是从命令行到程序的输入是行缓冲的。也就是说,它一次只被发送到程序一行。有一些困难的方法可以解决这个问题,但它们通常效果不佳。
如果你用你正在尝试完成的高于此级别的内容来澄清你的问题,人们可能会提供更好的解决方案。同时,这是一个简单的版本,如果用户按下 tab 然后输入,则结束输入:
def get_input_ending_with_tab():
inp = input() + "\n"
while not inp.endswith("\t\n"):
inp += input() + "\n"
return inp
这是一个更复杂的版本,可以满足您的需求,但无法在 Windows 上运行。这也只能在程序的交互式执行中起作用(当它附加到 TTY 时)。
import sys
import tty
import termios
def get_input_ending_with_tab_2():
buf = ""
stdin = sys.stdin.fileno()
tattr = termios.tcgetattr(stdin)
try:
tty.setcbreak(stdin, termios.TCSANOW)
while True:
buf += sys.stdin.read(1)
print(buf[-1], end="")
sys.stdout.flush()
if buf[-1] == "\t":
break
finally:
termios.tcsetattr(stdin, termios.TCSANOW, tattr)
print()
return buf
推荐阅读
- c++ - 在它的 64 位表示中找到数字 n 的第 b 位,带符号
- r - 从数据框中的数据绘制社交网络图
- javascript - 从 JSON 创建对象并解析 JSON - 不同的结果
- software-design - 这些开发、实施、建设有什么区别
- ocaml - 模式匹配中变量的别名
- javascript - 如何比较两个数组并从第一个数组中获取第一个匹配对象?
- python - pandas-datareader 提取价格值
- c++ - C++ says gcd is not a member of std
- ruby-on-rails - `Apartment::Tenant.switch!` 在`bin/rails 控制台`期间使用`pry`
- oauth - 这是一种安全的用户身份验证方法吗?如果是这样,是否可以简化以减少请求总数?