gpt4 book ai didi

python - 如何使用 Python 的计时器一次读取一个字符的键盘输入

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:49 25 4
gpt4 key购买 nike

我正在尝试弄清楚如何创建一个可以采用以下参数的小 Python 脚本:

  1. 提示 - 字符串
  2. 整数等待时间
  3. 停止前的字符数

最后一个是在程序停止接受字符并开始处理输入之前我可以输入的字符数。我见过一些人使用 Python 的 select.select method ,但这并没有说明第三项。我倾向于诅咒,虽然我不知道它是否支持让我想到线程的超时。任何见解都会很棒!这将在带有 Python 2.6 的 Linux 上运行。

最佳答案

好的,我已经做到了:D。

#!/usr/bin/env python

import sys
from select import select

def main(argv):
timeout = 3
prompt = '> '
max_chars = 3

# set raw input mode if relevant
# it is necessary to make stdin not wait for enter
try:
import tty, termios

prev_flags = termios.tcgetattr(sys.stdin.fileno())
tty.setraw(sys.stdin.fileno())
except ImportError:
prev_flags = None

buf = ''
sys.stderr.write(prompt)

while True: # main loop
rl, wl, xl = select([sys.stdin], [], [], timeout)
if rl: # some input
c = sys.stdin.read(1)
# you will probably want to add some special key support
# for example stop on enter:
if c == '\n':
break

buf += c
# auto-output is disabled as well, so you need to print it
sys.stderr.write(c)

# stop if N characters
if len(buf) >= max_chars:
break
else:
# timeout
break

# restore non-raw input
if prev_flags is not None:
termios.tcsetattr(sys.stdin.fileno(), termios.TCSADRAIN, prev_flags)
# and print newline
sys.stderr.write('\n')

# now buf contains your input
# ...

if __name__ == "__main__":
main(sys.argv[1:])

它相当不完整;我只是放了一些值来测试它。几句解释:

  1. 您需要将 tty 切换到“原始”模式——否则您将无法在没有通过回车键确认的情况下获得输入,
  2. 在原始模式下,默认情况下不再输出输入的字符——如果你想让用户看到他正在输入的内容,你需要自己输出它们,
  3. 您可能想要处理特殊键,例如回车键和退格键——我在这里添加了回车键处理。也许您可以为此重用部分 curses
  4. 我假设超时是“最后一个键后 3 秒”。如果你想要整个过程超时,我认为最简单的方法是获取当前时间,通过超时增加它(即获取 end_time),然后传递 end_time - current_time select(),
  5. 的超时秒数
  6. 我已将特定于 unix 的导入设为可选。不过,我不知道它是否能在 Windows 上正常运行。

关于python - 如何使用 Python 的计时器一次读取一个字符的键盘输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183472/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com