Найти - Пользователи
Полная версия: Tkinter + горячие клавиши в русской раскладке
Начало » GUI » Tkinter + горячие клавиши в русской раскладке
1
vanvanov
Добрый день. Обратил внимание на то, что в Windows в русской раскладке не работают горячие клавиши (например, ‘<Control-v>’) (в Linux все работает). С чем это связано? Как исправить? Пытался сделать
entry.bind('<Control-м>',test_func)
но это приводит к
_tkinter.TclError: bad event type or keysym “м”
Griffon
Попробуйте проверять event.state и event.keycode. Ловить можно просто <KeyPress>.
Например нажимая Ctrl+C при любой раскладке вы должны получить keycode=67, а bool(event.state & 4) должно быть True.
vanvanov
Griffon
У Ctrl+V во всех раскладках код 55. А могу ли я как-нибудь привязать этот код к событию?
entry.bind(55,test_func)
Ничего не дает.
4kpt_III
Вы можете KeyPress или KeyRelease перехватить, а внутри функции-обработчика уже перенаправить. Узнать, какая кнопка нажата можно через event. Еще есть virtual events, которые позволяют повесить один обработчик на несколько событий сразу.
vanvanov
4kpt_III
Узнать, какая кнопка нажата можно через event.
Пытаюсь это сделать с помощью такого кода:
#!/usr/bin/python3
import tkinter as tk
def test_func(event):
	print("Pressed",repr(event.char))
root=tk.Tk()
frame=tk.Frame(root,width=300,height=300)
frame.pack()
frame.bind('<KeyRelease>',test_func)
frame.focus_set()
root.mainloop()
В результате, ‘Contol-v’ дает
Pressed ‘'
Pressed ’м'
В винде получаю:
Exception in Tkinter callback
Traceback (most recent call last):
File “C:\Python33\lib\tkinter\__init__.py”, line 1489, in __call__
return self.func(*args)
File “tst100.pyw”, line 6, in test_func
print(“Pressed”,repr(event.char))
File “C:\Python33\lib\encodings\cp866.py”, line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_map)
UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\xec’ in position 1:
character maps to <undefined>
Без repr также получаю ошибку. Т.е. еще надо следить за локалью.
Делаю chcp 65001 (меняет кодовую страницу на UTF-8), получаю ‘ñ’ при нажатии ‘м’. Сочетание ‘<Control-ñ>’ также не привязывается.

Но даже если я разберусь с локалью, как мне поймать именно ‘Control-м’, а не просто ‘м’?
4kpt_III
Смотрите. У каждой кнопки в зависимости от кодировки есть свой код. Там четыре параметра (char, keycode, keysum, keysum_num). Нужно писать обработчик, который будет перехватывать все нажатия (Any), отбирать из них нужные и уже распределять их по callback.

P.S. Нужно искать уникальный код по четырем параметрам для определения нажатия. Ничего более дельного посоветовать не могу, так как не пользуюсь виндой и проверить нет возможности, а накатывать это говно на свою машину желания нет
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB