PYTHON. можно ли ввести два символа в keyboard.wait()?

переделаю текст в более простой и понятный

import keyboard
print(“start”)
keyboard.wait(!!!“ctrl” or “shift”!!!)
print(“end”)

задача кода- дождаться пока будет нажата ИЛИ ctrl ИЛИ shift(приведённый вариант ниже с or не рабочий, функция будет ждать ответ только о нажатие crtl). как это можно сделать с помощью этого пакета. Можно предложить другой пакет или альтернативный выход из ситуации.


Ответы (2 шт):

Автор решения: Konstantin_SH

В wait нельзя, но можно использовать другую функцию.

Python 3:

import keyboard

def start():
    global exit 
    exit = True


def main():
    keyboard.add_hotkey('alt+p', start, suppress=True, trigger_on_release=True)
    while not exit:
        # Делаем всякое, пока не нажали alt+p.
    keyboard.remove_hotkey('alt+p')

Вместо start можно и print по нажатию вызвать, например:

import keyboard
def main():
    keyboard.add_hotkey('alt+p', print, args=('hello', 'hotkey'))
output: "hello hotkey"
→ Ссылка
Автор решения: Amgarak

Берем Dec коды клавиатуры - https://narvell.nl/keys

И инициализируем свой хук:

from collections import namedtuple
import ctypes
import win32con
import win32api
import win32gui
import atexit

KeyboardEvent = namedtuple('KeyboardEvent', ['event_type', 'key_code'])

event_types = {win32con.WM_KEYDOWN: 'key down',
                   win32con.WM_KEYUP: 'key up',
                   0x104: 'key down',  # WM_SYSKEYDOWN, used for Alt key.
                   0x105: 'key up',  # WM_SYSKEYUP, used for Alt key.
                   }

handlers = []

def listen():
    
    def low_level_handler(nCode, wParam, lParam):
        lParam = ctypes.cast(lParam, ctypes.POINTER(ctypes.c_ulong)).contents.value
        event = KeyboardEvent(event_types[wParam], lParam)
        
        for handler in handlers:
            handler(event)

        return ctypes.windll.user32.CallNextHookEx(hook_id, nCode, wParam, lParam)

    CMPFUNC = ctypes.CFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_void_p))
    ctypes.windll.user32.SetWindowsHookExW.argtypes = (
        ctypes.c_int,
        CMPFUNC,
        ctypes.c_void_p,
        ctypes.c_uint
    )
    pointer = CMPFUNC(low_level_handler)

    hook_id = ctypes.windll.user32.SetWindowsHookExW(win32con.WH_KEYBOARD_LL, pointer,
                                                     win32api.GetModuleHandle(None), 0)

    atexit.register(ctypes.windll.user32.UnhookWindowsHookEx, hook_id)

    win32gui.GetMessage(None, 0, 0)


if __name__ == '__main__':
    def print_event(event):
        
        if event.key_code == 160 or event.key_code == 162:
            print("Нажат ctrl ИЛИ shift:", event)

    handlers.append(print_event)
    listen()

Примеры моих извращений на тему хуков: https://gist.github.com/Amgarak/5df8477bad67dabbc491322e74ce1c2c

→ Ссылка