Форум программистов, компьютерный форум, киберфорум
Python: IDE, инструментарий
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/25: Рейтинг темы: голосов - 25, средняя оценка - 4.56
0 / 0 / 1
Регистрация: 15.12.2019
Сообщений: 107

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

08.12.2020, 16:02. Показов 5052. Ответов 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
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru