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

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

08.12.2020, 16:02. Показов 5138. Ответов 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
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru