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
”,然后跳过输入函数而从未获得用户输入,则这是有问题的。此外,它可以填充用户输入数据不需要的字符。
有没有简单的方法:
- 暂时将焦点从终端移开?
- 刷新标准输入? (
sys.stdin.flush()
遗憾的是不起作用)
- 以不同的方式使用 '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
我重新制作了这个更简单的 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
”,然后跳过输入函数而从未获得用户输入,则这是有问题的。此外,它可以填充用户输入数据不需要的字符。
有没有简单的方法:
- 暂时将焦点从终端移开?
- 刷新标准输入? (
sys.stdin.flush()
遗憾的是不起作用) - 以不同的方式使用 '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