代码之家  ›  专栏  ›  技术社区  ›  user1783732

无法在没有echo的情况下检查在macOS上的Python中按下的键

  •  1
  • user1783732  · 技术社区  · 1 年前

    在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()
    
    

    它实际上检测到按键被按下。但是有一个问题:输入的字符会被回显。我试图通过禁用 termios.ECHO 但它似乎不起作用。

    以下是macOS测试的输出:

    $ python test.py
    Testing select:
    1%                    
    

    (在测试过程中按下按键“1”)。 第二个问题是:为什么会有 % 显示在最后?

    我想要的是:既没有“1”的回声,也没有“%”的回声。

    1 回复  |  直到 1 年前
        1
  •  1
  •   Barmar    1 年前

    在循环期间打开和关闭回声允许用户在回声打开时提前键入,并且他们的输入将被回声。

    循环之前关闭回声,循环结束后再打开回声。