【问题标题】:Remap shortcuts my combinin pyautogui and pynput重新映射快捷方式我的组合 pyautogui 和 pynput
【发布时间】:2019-08-02 23:00:22
【问题描述】:

我正在尝试重新映射结合了 pynput 和 pyautogui 的快捷方式,但出现错误

在执行中 使用keyboard.pressed(Key.shift): AttributeError: 模块 'pynput.keyboard' 没有属性 'pressed'

from pynput import keyboard
import pyautogui

# The key combination to check
COMBINATIONS = [
    {keyboard.Key.ctrl, keyboard.KeyCode(char='z')},
    {keyboard.Key.ctrl, keyboard.KeyCode(char='x')}
]

# The currently active modifiers
current = set()

def execute():
    pyautogui.typewrite('Hello world!\n', interval=secs_between_keys)
    #pyautogui.hotkey('cmd', 'v')

def on_press(key):
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.add(key)
        if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
            execute()

def on_release(key):
    if any([key in COMBO for COMBO in COMBINATIONS]):
        current.remove(key)

with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
    listener.join()

我是一个初学者,不知道为什么我不能在这里使用 pyautogui 函数。你能开导我吗?非常感谢!

【问题讨论】:

    标签: python hotkeys pyautogui pynput


    【解决方案1】:

    这是一个使用 pynput 的完整且经过测试的示例:

    from pynput import keyboard
    
    # The key combination to check
    COMBINATIONS = [
        {keyboard.Key.ctrl_l, keyboard.KeyCode(char='z')},
        {keyboard.Key.ctrl_r, keyboard.KeyCode(char='z')},    
        {keyboard.Key.ctrl_l, keyboard.KeyCode(char='x')},    
        {keyboard.Key.ctrl_r, keyboard.KeyCode(char='x')}
    ]
    
    # The currently active modifiers
    current = set()
    
    def execute():
        print("Here I am")
    
    def on_press(key):
        if any([key in COMBO for COMBO in COMBINATIONS]):
            current.add(key)
            if any(all(k in current for k in COMBO) for COMBO in COMBINATIONS):
                execute()
    
    def on_release(key):
        if any([key in COMBO for COMBO in COMBINATIONS]):
            current.remove(key)
    
    with keyboard.Listener(on_press=on_press, on_release=on_release) as listener:
        listener.join()
    

    在我看来,主要问题与使用操作系统或其他应用程序使用的特定组合键(例如 Control + C)有关。

    【讨论】:

    • 不幸的是,这段代码也被破坏了...文件“/Users/martinhorst/Documents/teste.py”,第 14 行,在执行 pyautogui.typewrite('Hello world!\n', interval=secs_between_keys) NameError: name 'secs_between_keys' is not defined
    • 对不起@MartinHorst 但我这台电脑上没有pyautogui,现在试试我简化了它。添加您的 pyautogui 部分应该是微不足道的,如果您需要我帮助,请告诉我。
    • 谢谢你 - 到目前为止一切顺利,我已经设法让 shell 打印消息;我面临的问题是如何使 ctrl-z 或 ctrl-x 触发另一个组合键:)
    • 那么你要做的就是比如按下control+c,触发acontrol+a和control+b?
    • 完全正确 - 我想为一个热键分配一系列其他热键(它们之间有一些等待时间),就像 PC 上的 AutoHotKey 一样(因为 Mac 没有 AutoHotKey)
    【解决方案2】:

    你想要press 接受key 参数,而不是pressed

    来自文档:-

    Controller.press(key)
    Presses a key.
    
    A key may be either a string of length 1, one of the Key members or a KeyCode.
    

    【讨论】:

      猜你喜欢
      • 2023-03-27
      • 2020-09-17
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多