Python键盘库方向键问题

新手上路,请多包涵

我正在编写一个脚本,它截取屏幕截图并解码图像名称中的特定按键,如下所示。我的问题是,当我按下键盘左箭头时,数字 4 也被按下了。我在谷歌或键盘库的文档中找不到任何东西。我正在使用 Windows 和 Python 3.6.5

 (75,)
left arrow pressed
(5, 75)
4 pressed

向下箭头也会发生同样的事情,但数字 3 会发生。

 (80,)
down arrow pressed
(3, 80)
2 pressed

代码:

 from PIL import ImageGrab
import keyboard  # using module keyboard
import time

keys = [
    "down arrow",
    "up arrow",
    "left arrow",
    "right arrow",
    "w",
    "s",
    "a",
    "d",
    "1",
    "2",
    "3",
    "4",
    "q",

“e”,“f”]

 if __name__ == "__main__":
    while True:
        code = []
        try:
            for key in keys:
                if keyboard.is_pressed(key):
                    print(keyboard.key_to_scan_codes(key))
                    print(f"{key} pressed")
                    code.append(1)
                else:
                    code.append(0)

            if keyboard.is_pressed('esc'):
                print(key + " pressed")
                break

            c = "".join(map(str, code))
            snapshot = ImageGrab.grab()
            save_path = str(int(time.time()*1000)) + "-" + c + ".jpg"
            snapshot.save("tmp\\" + save_path)

        except:
            break

原文由 Kev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 846
2 个回答

keyboard 模块有针对此类实例的简单解决方案,它们使用 event-triggered 激活而不是 polling 就像您在尝试中使用的那样。

示例代码:

 import keyboard

def handleLeftKey(e):
    if keyboard.is_pressed("4"):
        print("left arrow was pressed w/ key 4")
        # work your magic

keyboard.on_press_key("left", handleLeftKey)
# self-explanitory: when the left key is pressed down then do something

keyboard.on_release_key("left", handleLeftKey02)
# also self-explanitory: when the left key is released then do something

# don't use both ...on_release & ...on_press or it will be
# triggered twice per key-use (1 up, 1 down)

替换下面的代码并根据您的需要进行更改。

 if __name__ == "__main__":
    while True:
        code = []
        try:
            for key in keys:
                if keyboard.is_pressed(key):
                    print(keyboard.key_to_scan_codes(key))
                    print(f"{key} pressed")
                    code.append(1)
                else:
                    code.append(0)

另一种更动态的方法如下:

 import keyboard

keys = [
    "down",
    "up",
    "left",
    "right",
    "w",
    "s",
    "a",
    "d",
    "1",
    "2",
    "3",
    "4",
    "q",
    "e",
    "f"
]

def kbdCallback(e):
    found = False
    for key in keys:
        if key == keyboard.normalize_name(e.name):
            print(f"{key} was pressed")
            found = True
            # work your magic

    if found == True:
        if e.name == "left":
            if keyboard.is_pressed("4"):
                print("4 & left arrow were pressed together!")
                # work your magic

keyboard.on_press(kbdCallback)
# same as keyboard.on_press_key, but it does this for EVERY key

我注意到的另一个问题是您使用的是 "left arrow" 但实际上它被识别为 "left" (至少在我的系统上,它可能与您的不同,但我假设您希望它在所有系统上工作,所以使用 "left" 会更安全)

您可以使用的最后一种方法是非常静态类型的,没有动态功能,但可以在 "4+left""left+4" 的情况下使用

import keyboard

def left4trigger:
    print("the keys were pressed")

keyboard.add_hotkey("4+left", left4trigger)
# works as 4+left or left+4 (all of the examples do)

你看起来足够聪明,可以从那里找出其余的。

原文由 255.tar.xz 发布,翻译遵循 CC BY-SA 4.0 许可协议

当心,语言可能会起作用!在我的例子中,“向上”箭头被翻译成我的本地语言,您可以运行以下代码来获取您计算机的键值:

 import keyboard
def onkeypress(event):
    print(event.name)

keyboard.on_press(onkeypress)

#Use ctrl+c to stop
while True:
    pass

原文由 Cristian 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏