Skip to content

Macro

To set up a macro, add a macro to the keymap and define its function. By default, Fn is configured as macro number 0:

# code.py
from keyboard import *

keyboard = Keyboard()
keyboard.keymap = (
    (
        ESC,   1,   2,   3,   4,   5,   6,   7,   8,   9,   0, '-', '=', BACKSPACE,
        TAB,   Q,   W,   E,   R,   T,   Y,   U,   I,   O,   P, '[', ']', '|',
        CAPS,  A,   S,  D,   F,   G,   H,   J,   K,   L, ';', '"',    ENTER,
        LSHIFT,Z,   X,   C,   V,   B,   N,   M, ',', '.', '/',         RSHIFT,
        LCTRL, LGUI, LALT,          SPACE,        RALT, MENU,  MACRO(0), RCTRL
    ),
)

def macro_handler(dev, n, is_down):
    if is_down:
        dev.send_text('You pressed macro #{}\n'.format(n))
    else:
        dev.send_text('You released macro #{}\n'.format(n))

keyboard.macro_handler = macro_handler
keyboard.run()

Examples

Use a macro to launch the Calculator application on Windows

Replace the function macro_handler with the following code to launch the Calculator with a single keystroke:

def macro_handler(dev, n, is_down):
    if is_down and n == 0:
        dev.send(GUI, R)
        time.sleep(0.1)
        dev.send_text('calc\n')

Automatic typing

Use the following code to read a file in the keyboard's USB storage and type its content automatically:

def macro_handler(dev, n, is_down):
    if is_down and n == 0:
        with open('code.py', 'r') as f:
            for line in f:
                dev.send_text(line)

Repeated key strokes

Use a macro to trigger a repeated sequence of key presses until a new key is pressed:

def macro_handler(dev, n, is_down):
    if n == 0 and not is_down:
        t = time.time()
        dt = 0.01                   # seconds
        while dev.scan() < 2:
            if time.time() > t:
                dev.send_text('hello, world\n')
                t += dt