Как назначить асинхронную обработку горячих клавиш?
Нужно добавить глобальные горячие клавиши. Например, f4 и f8. Использую библиотеку keyboard. Есть проблема, пока первый обработчик не закончит работу, новые нажатия клавиш игнорируются.
Другими словами, сейчас работает так
pressed f4
end for f4
pressed f8
end for f8
А нужно сделать так
pressed f4
pressed f8
end for f4
end for f8
Демо код
# pip install keyboard
from keyboard import add_hotkey, wait
from time import sleep
def on_callback(key):
print('pressed', key)
sleep(5) # эмуляция долгой работы
print('end for', key)
add_hotkey("f4", lambda: on_callback("f4"))
add_hotkey("f8", lambda: on_callback("f8"))
wait('esc')
Попробовал asyncio, но ничего не изменилось
pressed f4
end for f4
pressed f8
end for f8
from keyboard import add_hotkey, wait
import asyncio
async def on_callback(key):
print('pressed', key)
await asyncio.sleep(5)
print('end for', key)
add_hotkey("f4", lambda: asyncio.run(on_callback("f4")))
add_hotkey("f8", lambda: asyncio.run(on_callback("f8")))
wait('esc')
Ответы (2 шт):
Автор решения: Ян Морозов
→ Ссылка
Попробуйте через потоки
from threading import Thread
def main(key):
add_hotkey(key, lambda: on_callback(key))
Thread(target=main,args=(“f4”).start()
Thread(target=main,args=(“f8”).start()
Автор решения: Viewed
→ Ссылка
Разработчик библиотеки подсказал использовать функцию keyboard.call_later. Она создает новый поток для каждого вызова обработчика. Но не выглядит ли это дорого? Сделать через asyncio так и не вышло.
# pip install keyboard
from keyboard import add_hotkey, wait, call_later
from time import sleep
def on_callback(key):
print('pressed', key)
sleep(5)
print('end for', key)
add_hotkey("f4", lambda: call_later(on_callback, args=("f4",)))
add_hotkey("f8", lambda: call_later(on_callback, args=("f8",)))
wait('esc')