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