【问题标题】:Python keyboard library arrow keys problemPython键盘库方向键问题
【发布时间】:2019-03-03 20:55:47
【问题描述】:

我正在编写一个脚本,它会截取屏幕截图并解码以图像名称命名的特定按键,如下所示。 我的问题是,当我按下左键盘箭头时,也按下了数字 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

【问题讨论】:

    标签: python keyboard


    【解决方案1】:

    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)
    

    你看起来很聪明,可以从那里弄清楚其余的事情。

    【讨论】:

    • ImportError: You must be root to use this library on linux.之前看起来是一个很棒的解决方案
    【解决方案2】:

    您可能需要先停用 NumLock 按钮。当 NumLock 处于活动状态时,我在按 Shift 键时遇到一些问题。

    【讨论】:

    • 很遗憾,一切都没有改变
    【解决方案3】:

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

    import keyboard    
    def onkeypress(event):
        print(event.name)
    
    keyboard.on_press(onkeypress)
    
    #Use ctrl+c to stop
    while True:
        pass
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      相关资源
      最近更新 更多