Как установить горячие клавиши в python?
Я хочу установить горячие клавиши
Для этого я установил pynput и использую этот код
from pynput.keyboard import Key, KeyCode, Listener
import sys
import pyscreenshot as ImageGrab
# закончить код
def end_fun():
print('end_fun')
sys.exit()
def start_mouse():
print('sssss')
#input('input:')
def save_image():
print('ffff')
im = ImageGrab.grab()
# Код для горячих клавищ
combination_to_function = {
frozenset([KeyCode(vk=49)]): end_fun, #1
frozenset([KeyCode(vk=50)]): start_mouse,#2
frozenset([KeyCode(vk=51)]): save_image,#3
}
# The currently pressed keys (initially empty)
pressed_vks = set()
def get_vk(key):
return key.vk if hasattr(key, 'vk') else key.value.vk
def is_combination_pressed(combination):
return all([get_vk(key) in pressed_vks for key in combination])
def on_press(key):
vk = get_vk(key) # Get the key's vk
print(':vk =', vk, ':key =', key)
pressed_vks.add(vk) # Add it to the set of currently pressed keys
for combination in combination_to_function: # Loop through each combination
if is_combination_pressed(combination): # Check if all keys in the combination are pressed
combination_to_function[combination]() # If so, execute the function
def on_release(key):
vk = get_vk(key) # Get the key's vk
pressed_vks.remove(vk) # Remove it from the set of currently pressed keys
with Listener(on_press=on_press, on_release=on_release) as listener:
listener.join()
Но проблема в том что когда я подключасторонниеие модули то почему то функция начинает воспроизводится вне зависимости от того какую клавишу я нажимаю также код слетает когда я использую команду input. или сложную комбинацию букв Как мне это исправить?
Ответы (1 шт):
Ошибки в вашем коде возникают, когда в коде сторонней библиотеке появляется time.sleep(...) или подлагивания при работе основного потока. Модуль pynput продолжает собирать очередь событий, даже если основной поток с Listener'ом занят какой-то другой задачей. Обойти эти ошибки можно, если создать свой цикл обработки, который будет напрямую обращаться к внутренней очереди pynput, а не занимать основной поток Listener'ом. Например pynput предлагает ещё один способ обработки событий - Events. Это - прямой доступ к очереди. Пример:
from pynput import keyboard
def on_down(key) # Колбек зажатой кнопки
print("Pressed {}".format(key))
input("input:") # input не вылетает и не зависает
def on_up(key) # Колбек отжатой кнопки
print("Released {}".format(key))
while True: # Цикл вне блока with для постоянного обновления очереди
with keyboard.Events() as events:
event = events.get(1) # Ждём событие клавиши 1 секунду
if event == None: # Если события не было, обновляем очередь
continue
elif isinstance(event, keyboard.Events.Press): # Кнопка зажата
on_down(event.key)
else: # Кнопка отжата
on_up(event.key)