Python: 使用键盘模块将按键操作持久化到终端

Python: Using keyboard module persists key actions to the terminal

我重新制作了这个更简单的 Python 3.8 代码版本,它模拟了我的程序 运行 在 Windows 10 上的一些不良行为。主要的外部依赖是这个 keyboard module:

import keyboard
from time import sleep


def get_key() -> str:
    """
    Get the user-pressed key as a lowercase string. E.g. pressing the spacebar returns 'space'.
    :return: str - Returns a string representation of the pressed key.
    """

    print(f"Press any key...")

    while True:
        pressed_key: str = str(keyboard.read_key()).lower()

        if not keyboard.is_pressed(pressed_key):  # Wait for key release or keyboard detects many key presses.
            break
        else:
            continue

    return pressed_key


def main() -> None:
    pressed_key: str = get_key()

    print(f"You have pressed: '{pressed_key}'.")
    sleep(1)
    input("Now take other user input: ")


if __name__ == "__main__":
    main()

当 运行 python ./my_script.py 在终端中按下随机键(比如 'g')时,我得到以下输出:

> Press any key...
> You have pressed: 'g'.
> Now take other user input: g

问题是,当程序进入内置 input() 函数时,字符“g”已预填充到终端中。如果初始用户输入是“enter”,然后跳过输入函数而从未获得用户输入,则这是有问题的。此外,它可以填充用户输入数据不需要的字符。

有没有简单的方法:

  1. 暂时将焦点从终端移开?
  2. 刷新标准输入? (sys.stdin.flush() 遗憾的是不起作用)
  3. 以不同的方式使用 'keyboard' 以便不会发生这种双字符记录行为?

欢迎大家提问和回复,谢谢。

通过为 read_key() 函数使用 suppress=True 关键字参数,我已经能够暂时解决问题。

注意:此 'solution' 仍然具有在程序执行后仍然存在的关键功能,因此字符将出现在您的终端输入行中。

解决方案:

def get_key() -> str:
    """
    Get the user-pressed key as a lowercase string. E.g. pressing the spacebar returns 'space'.
    :return: str - Returns a string representation of the pressed key.
    """

    print(f"Press any key...")

    while True:
        pressed_key: str = str(keyboard.read_key(suppress=True)).lower()

        if not keyboard.is_pressed(pressed_key):  # Wait for key release or keyboard detects many key presses.
            break
        else:
            continue

    return pressed_key