Я пишу программу на Python, используя библиотеку Pynput. Эта библиотека может прослушивать ключи, используя коды клавиш, такие как эти . В Windows это работало нормально, и коды клавиш те же, что и в приведенной выше ссылке, но в Linux некоторые клавиши выключены на 32, а другие выключены на 16.
Для пример! Клавиша отображается как 049, когда я запускаю свою программу в Windows, но как 033, когда я запускаю ее в Linux (разница 16). Клавиша r в Windows отображается как 82, а в Linux - как 114. Наконец, цифровые клавиши 0–9 отображаются как коды клавиш 096–105 в Windows, но в Linux их коды клавиш отображаются как «None», за исключением цифровой клавиатуры 5, которая отображается как 65437. Этот последний пример особенно странен для меня ,
Результатом этого является то, что моя программа отлично работает в Windows, и ввод! Reload интерпретируется так, как он печатается, но в Linux она интерпретируется как! R5lo14. Самым запутанным моментом является то, что только некоторые ключи интерпретируются правильно, а некоторые нет. Буквы сброшены на 32, но r, l и o верны, e, a и d не верны. ! ключ также корректен, несмотря на то, что он выключен 16 вместо 32. Все клавиши с цифровыми клавишами интерпретируются правильно, кроме цифровой клавиатуры 5.
Вот как я получил значение ключа из моей программы:
# Starts Pynput listener. When you press a key, it calls word_builder with the argument key
with Listener(on_press=self_word_builder) as self._listener:
self._listener.join()
# Builds a word as you type
def word_builder(self, key):
self._key = key
# Assigns self._keycode with the string value of key
self._keycode_to_keydata()
# MAP VK KEYS HERE. Below codeblock shows this in more detail
# Output resulting key
print(self._keycode)
Я просто хотел заметить, что это не проблема с Pynput, поскольку он не распознавал клавиши numpad даже на Windows. Мы исправили это, переназначив ключи pynput, читаемые как vk, например vk_numpad1. Это когда он больше не работает правильно на Linux. Это переназначение приведено ниже:
# Map virtual key codes for key codes outside the typical ASCII keyboard range
self._vk_map = {
110: '.', # [Num .]
}
# Numpad support
self._vk_map.update({i: f'{i - 96}' for i in range(96, 106)}) # [Num 0] = 96, [Num 1] = 97
if hasattr(self._key, 'vk'):
# Map the vk values
if self._key.vk in self._vk_map:
key = self._vk_map[self._key.vk]
До нашего исправления все правильно работало на Windows и Linux, за исключением клавиш с цифровой клавиатурой, поэтому почти 10 * * показывает, что некоторые клавиши отображаются как виртуальные ключи, а не другие, но я не уверен, как это подтвердить.
В своих попытках это исправить я попытался найти Linux эквивалент кодов клавиш Windows, которые я разместил выше, но Я не мог ничего найти. Самым близким, что я нашел, было приложение на моей машине под названием Character Map, которое находило эти ключи в отдельных списках. Например, когда я искал мой нижний регистр e, он ошибся (101), но верхний регистр E был правильным (069). Каждый из них появился в другом списке символов, который был назван по-разному. ! появился в третьем списке персонажей. Есть ли у Linux список кодов клавиш по умолчанию, или он отличается на каждом Linux компьютере?
Я также пытался исправить это программно, но я не могу найти других людей, перечисляющих эту проблему, где бы я ни смотрел. Я не очень понимаю, что происходит, поэтому мне очень трудно даже попытаться исправить ситуацию. Я только нашел причину (коды символов появляются неправильно в Linux), но так как они не расходятся с эквивалентом Windows с той же суммой, я не могу просто исправить это смещение. С этим постом я надеялся получить представление о том, что происходит, и любые предложения о том, как лучше всего решить эту проблему. Заранее спасибо за любые предложения.