我正在用Python编写一个程序来检测按下的键,并根据我的键盘做出决定。
我想使用python中的键盘模块来实现它。
我会做这样的事情,
import keyboard
while True:
if keyboard.read_key() == 'enter':
print('Enter is pressed)
if keyboard.read_key() == 'q':
print('Quitting the program)
break
if keyboard.read_key() == 's':
print('Skiping the things')
但是没用。当我执行这个程序时,我必须按两次s才能执行“s”块。
另外,我有一个问题,执行完成后,它会在我的命令提示符中写入所有键,是否可以解决这个问题?
根据键盘文档:
其他应用程序(例如某些游戏)可能会注册吞噬所有关键事件的钩子。在这种情况下键盘将无法报告事件。
使用
keyboard
模块解决问题的一种方法是 keyboard.wait('key')
# Blocks until you press esc
keyboard.wait('esc')
解决方法如下:
import keyboard
keyboard.wait('enter')
print('Enter is pressed')
keyboard.wait('q')
print('Quitting the program')
keyboard.wait('s')
print('Skiping the things')
据我所知,只有一种有效的方法来检测用户输入是否是键盘输入或鼠标输入,这是一个名为 pynput 的库......
from pynput.keyboard import Key , Listener , Controller
keyboard = Controller()
DoubleShot=False
shot=False
def on_press(key):
global DoubleShot
global shot
if Key.num_lock == key:
print("activate")
DoubleShot=True
if DoubleShot:
if Key.shift == key:
shot = not shot
if shot:
keyboard.press(Key.shift)
keyboard.release(Key.shift)
def on_release(key):
if key == Key.esc:
return False
with Listener(on_press=on_press , on_release=on_release) as listener:
listener.join()
我创建这个游戏是为了在点击“shift”时多次射击
注意: 在我的例子中,无限循环是一个问题,这就是为什么shot变量可以停止循环
首先,你忘记关闭第 4 行和第 6 行的字符串。
但您的主要问题是您为 if 语句的每个分支调用
keyboard.read_key()
一次。这会使您的代码等待按键,检查它是否是 'enter'
,然后等待另一个按键,检查它是否是 'q'
,依此类推。
您应该做的是将密钥保存到变量中,然后检查该变量。它应该看起来像这样:
import keyboard
while True:
key = keyboard.read_key()
if key == 'enter':
print('Enter is pressed')
if key == 'q':
print('Quitting the program')
break
if key == 's':
print('Skiping the things')