0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107

Python keyboard.add_hotkey(): как правильно сохранить значения горячих клавиш?

08.12.2020, 16:02. Показов 5071. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одном из приложений на библиотеке keyboard, пытаюсь реализовать установку и последующее сохранение горячей(-их) клавиш(-и), для того чтобы после перезапуска приложения, кнопки подгружались, устанавливались и их не надо было заново биндить.

Документация: ссылка на документацию по библиотеке keyboard

Храню кнопки в БД, использую SQLite

Алгоритм такой:

1. Если в базе пусто, создаем значение button и вызываем функцию для прослушивания клавиш.
2. С помощью вызванной функции биндим клавишу или сочетание клавиш
3. Алгоритм определяет одна ли это клавиша, или несколько и добавляет в keyboard.add_hotkey(), после чего сохраняет.
4. Если при входе в базе не пусто - достает значение и также устанавливает keyboard.add_hotkey().

Проблема:

Все работает, но есть одно НО. Значение нажатой клавиши определяется текущей раскладкой. Если сохранить клавишу/сочетание клавиш на русском языке, то потом, когда я снова запущу приложение с включенной английской раскладкой, keyboard выдаст ошибку о том, что не знает, например, клавиши "Ч". Точно также при переходе с английской раскладки на русскую.

● Если сохранять кнопки через keyboard.hook(), то из переданного события можно получить как название кнопки - "K"/"Л", так и ее код - 37. И если биндить уже код, тогда проблемы не возникает, ведь код кнопки общий для обеих раскладок. Но мне нужна возможность биндить 2 клавиши, а keyboard.hook() сразу отправляет event при нажатии одной.

● Я пробовал получать коды кнопок через keyboard.key_to_scan_codes(), но в таком случае их нельзя забиндить через метод keyboard.add_hotkey(), так как он принимает значение key либо в виде строки: 'ALT+F', либо в виде числа. И если я захочу записать комбинацию клавиш в виде пары чисел - я получу сумму этих чисел, то есть совсем другую ОДНУ клавишу.

Примеры:

Python
1
2
3
4
keyboard.add_hotkey('ctrl+shift', callback) ⬅⬅⬅⬅⬅ True
keyboard.add_hotkey(29, callback) ⬅⬅⬅⬅⬅ True (29 - код кнопки CTRL)
keyboard.add_hotkey(16+17, callback) ⬅⬅⬅⬅⬅ True (16 - Q, 17 - W, но в результате получаем 33 - кнопка F)
keyboard.add_hotkey('16+17', callback) ⬅⬅⬅⬅⬅ False (16 - Q, 17 - W, но keyboard говорит что это неизвестные клавиши)
Код: (не уверен, что он нужен, но можете сами пронаблюдать проблему)

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import keyboard, sqlite3
 
def callback():
    print('Функция вызвана')
 
def bind_keys():
    print('Нажмите клавишу / Сочетание двух клавиш')
 
    key = keyboard.read_hotkey(suppress=False)
    key = str(key).split('+')
 
    if len(key) == 2:
        print(f'Нажато две кнопки: {key[0].upper()}, {key[1].upper()}')
        key = f'{key[0]}+{key[1]}'
    elif len(key) == 1:
        print(f'Нажата одна кнопка: {key[0].upper()}')
        key = key[0]
 
    keyboard.add_hotkey(key, callback, suppress = False)
 
    sql.execute(f"SELECT button FROM test WHERE button = '{key}'")
    if sql.fetchone() is None:
        sql.execute(f"INSERT INTO test VALUES('{key}')")
        db.commit()
        print('Клавиши сохранены')
    keyboard.wait()
 
 
db = sqlite3.connect('db.db')
sql = db.cursor()
sql.execute("CREATE TABLE IF NOT EXISTS test(button TEXT)")
db.commit()
 
sql.execute("SELECT * FROM test")
key = sql.fetchone()
if key != None:
    keyboard.add_hotkey(key[0], callback, suppress = False)
    keyboard.wait()
else:
    bind_keys()
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.12.2020, 16:02
Ответы с готовыми решениями:

Keyboard.add_hotkey() не ожидает нажатие клавиши
я написал фоновое приложение которое исправляет не правильно написанный текст например ( ghbdtn vbh ) исправляет на ( привет мир ) моя...

Как реализовать несколько горячих клавиш в программе?
Это моя первая программа на Delphi, я нашёл в интернете способ использования назначаемой из хоткея горячей клавиши, всё прекрасно работало,...

Как создать несколько горячих клавиш в делфи 7 ?
У меня есть готовый код, он работает, а как создать несколько таких клавиш? например: Ctrl + Q, Ctrl + P .... unit Unit1; ...

1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
10.12.2020, 13:33
Denis Numba, а разве нельзя создать словарь с названиями клавиш, да и скорее всего строковое название клавиши можно получить по коду, полистай исходники модуля.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2020, 13:33
Помогаю со студенческими работами здесь

как изменить\добавить значение горячих клавиш в summernote
это текстовый редактор. в нем есть горячие клавиши, но хотелось бы, чтобы сочетания ctrl+1/2/3 обрамляли текст не тегами h1,2,3 , а div...

Как перейти к экспортному методу при помощи горячих клавиш?
Добрый день! Подскажите как перейти к вызванному экспортному методу находящимся в другом модуле при помощи горячих клавиш? в 1с 8.2

Как остановить выполнение цикла путем нажатия горячих клавиш?
Добрый вечер уважаемые. Суть проблемы: Есть зацикленный процесс, который выполняется путем использования библиотеки pyautogui. Движение...

XE7 как использовать встроенный компонент HotKey1 для горячих клавиш?
Здравствуйте кто знает как использовать компонент HotKey1? пример мне надо по нажатию клавиш Alt+A или любой другой измененный в...

Эмуляция нажатия клавиш для неактивных WPF приложений или эмуляция глобальных горячих клавиш
Столкнулся с тем, что следующий код (нажатия опредлённых клавиш) не работает для такой программы как Snagit, и даже не похоже, что фокус...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru