Tkinter определяет раскладку клавиатуры

Есть ли способ определить текущую раскладку клавиатуры в Tkinter?

Необходимо правильно обрабатывать ускорители клавиатуры для таких языков, как русский, французский, греческий (см. Мой другой вопрос подробнее).


person Antony Hatchkins    schedule 23.01.2013    source источник
comment
Отчет, связанный с вашим вопросом, действительно предлагает подход к этому, проверяли ли вы его на bugs.python.org/ issue1794 # msg86386? Если это не помогает, объясните почему. Кроме того, знаете ли вы, как правильно определить текущую раскладку клавиатуры, используя что-нибудь еще? Я помню, как Ubuntu иногда с трудом обнаруживала даже мои самые типичные клавиатуры.   -  person mmgp    schedule 23.01.2013
comment
Я процитировал свой обходной путь, который похож на рецепт, указанный в вашей ссылке, в качестве ответа на мой исходный вопрос вместе с моими идеями относительно почему это могло быть плохо.   -  person Antony Hatchkins    schedule 23.01.2013
comment
Что касается определения раскладки клавиатуры в целом - по крайней мере, в Windows это вполне осуществимо: stackoverflow.com/questions/1291509/   -  person Antony Hatchkins    schedule 23.01.2013
comment
Это сильно отличается от определения раскладки клавиатуры, которое просто возвращает активную раскладку. Что делать, если активный макет неправильный? Ваш обходной путь не похож, он совершенно другой.   -  person mmgp    schedule 23.01.2013
comment
В упомянутом обходном пути (msg86386) gpolo устанавливает функцию и улавливает код клавиши, соответствующий необходимой физической кнопке. Я делаю то же самое, хотя я перевел код клавиши обратно в подробный keyym (например, см. Таблицу перевода здесь и ловим обычным способом. Может я вас неправильно понял?   -  person Antony Hatchkins    schedule 23.01.2013
comment
На самом деле в настоящее время на Tk не существует общего решения. Сначала я подумал, что обходной путь можно просто расширить, чтобы рассмотреть event.char, но я не думаю, что это сработает.   -  person mmgp    schedule 23.01.2013
comment
Я просмотрел все поля event и ни одно не соответствовало сканкоду (положению клавиши на клавиатуре)   -  person Antony Hatchkins    schedule 23.01.2013


Ответы (2)


Нет, в Tkinter нет такой функции.

Почему бы просто не попросить ваше приложение спросить пользователя, где находится каждый специальный ключ, при первом запуске приложения? Apple делает это с OSX - он попросил меня нажать пару клавиш в самый первый раз, когда я загрузил новую установку.

Вы можете поместить фокус в виджет и привязать его к <Any-KeyPress>, и из этого получить достаточно информации для привязки к любой нажатой клавише.

person Bryan Oakley    schedule 23.01.2013
comment
Пример приложения для wxPython безупречно выполняет перевод ускорителей клавиатуры без какого-либо вмешательства с моей стороны (под Windows). И все же вы говорите, что в Tkinter это невозможно сделать. - person Antony Hatchkins; 23.01.2013
comment
Просить пользователя о каждом ускорителе клавиатуры - ненужное бремя. Я видел это только в mc под Linux, и это одна из худших вещей в Midnight Commander) - person Antony Hatchkins; 23.01.2013
comment
›Вы можете сфокусироваться. Да, именно этим я сейчас и занимаюсь, и результат в моем ответе на исходный вопрос - person Antony Hatchkins; 23.01.2013

Кажется, что keysym есть ?? если раскладка не английская.

def key_callback(e):
    # Generate Ctrl-V if current layout is not english
    if e.state & 4 > 0 and chr(e.keycode) == 'V' and e.keysym == "??":
        root.focus_get().event_generate("<<Paste>>")
root.bind("<Key>", key_callback)
person Winand    schedule 29.12.2020