Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter + горячие клавиши в русской раскладке [RSS Feed]

#1 Авг. 26, 2015 19:38:16

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

Добрый день. Обратил внимание на то, что в Windows в русской раскладке не работают горячие клавиши (например, ‘<Control-v>’) (в Linux все работает). С чем это связано? Как исправить? Пытался сделать

entry.bind('<Control-м>',test_func)
но это приводит к
_tkinter.TclError: bad event type or keysym “м”

Офлайн

#2 Авг. 26, 2015 20:48:03

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

Попробуйте проверять event.state и event.keycode. Ловить можно просто <KeyPress>.
Например нажимая Ctrl+C при любой раскладке вы должны получить keycode=67, а bool(event.state & 4) должно быть True.



Офлайн

#3 Авг. 26, 2015 21:12:41

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

Griffon
У Ctrl+V во всех раскладках код 55. А могу ли я как-нибудь привязать этот код к событию?

entry.bind(55,test_func)
Ничего не дает.

Офлайн

#4 Авг. 26, 2015 22:01:52

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

Вы можете KeyPress или KeyRelease перехватить, а внутри функции-обработчика уже перенаправить. Узнать, какая кнопка нажата можно через event. Еще есть virtual events, которые позволяют повесить один обработчик на несколько событий сразу.

Офлайн

#5 Авг. 29, 2015 15:02:20

vanvanov
Зарегистрирован: 2013-03-31
Сообщения: 252
Репутация: +  4  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

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-м’, а не просто ‘м’?

Офлайн

#6 Авг. 29, 2015 23:20:14

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

Tkinter + горячие клавиши в русской раскладке

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

P.S. Нужно искать уникальный код по четырем параметрам для определения нажатия. Ничего более дельного посоветовать не могу, так как не пользуюсь виндой и проверить нет возможности, а накатывать это говно на свою машину желания нет

Отредактировано 4kpt_III (Авг. 29, 2015 23:21:25)

Офлайн

  • Начало
  • » GUI
  • » Tkinter + горячие клавиши в русской раскладке[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version