在Python中,我想在MacOS上检测按键,而不使用非标准的第三方库.以下是我的测试代码:

import select
import sys
import termios
from time import sleep

def is_key_pressed():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)

    try:
        new_settings = termios.tcgetattr(fd)
        new_settings[3] = new_settings[3] & ~(termios.ECHO | termios.ICANON)
        termios.tcsetattr(fd, termios.TCSADRAIN, new_settings)

        ready, _, _ = select.select([sys.stdin], [], [], 0)
        return sys.stdin in ready
    finally:
        termios.tcsetattr(fd, termios.TCSAFLUSH, old_settings)

def main():
    print("Testing select:")
    sleep_time = 1 / 60

    while True:
        sleep(sleep_time)
        if is_key_pressed():
            break

if __name__ == "__main__":
    main()

它实际上可以检测到按下的键.但有一个问题:输入字符被 echo .我试图通过禁用termios.ECHO来禁用回声,但它似乎不起作用.

以下是在MacOS上进行测试的结果:

$ python test.py
Testing select:
1%                    

(在测试过程中按了键‘1’). 第二个问题是:为什么最后会有一个%

我想要的是:没有"1"的回声,也没有"%".

推荐答案

在循环期间打开和关闭ECHO允许用户在ECHO打开时提前打字,他们的输入将被 echo .

在循环之前关闭ECHO,并在循环完成后将其重新打开.

Python相关问答推荐

如果条件为真,则Groupby.mean()

滚动和,句号来自Pandas列

根据在同一数据框中的查找向数据框添加值

Python json.转储包含一些UTF-8字符的二元组,要么失败,要么转换它们.我希望编码字符按原样保留

使用miniconda创建环境的问题

如何在Windows上用Python提取名称中带有逗号的文件?

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

在np数组上实现无重叠的二维滑动窗口

实现自定义QWidgets作为QTimeEdit的弹出窗口

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

NumPy中条件嵌套for循环的向量化

转换为浮点,pandas字符串列,混合千和十进制分隔符

从Windows Python脚本在WSL上运行Linux应用程序

处理具有多个独立头的CSV文件

PYTHON、VLC、RTSP.屏幕截图不起作用

使用__json__的 pyramid 在客户端返回意外格式

如何强制向量中的特定元素在Gekko中处于优化解决方案中

用由数据帧的相应元素形成的列表的函数来替换列的行中的值

如何在Quarto中的标题页之前创建序言页

pyspark where子句可以在不存在的列上工作