Shortcuter. Класс для расстановки клавиатурных сокращений в меню wxPython
Введение
Одним из самых неприятных (на мой взгляд) этапов создания качественного интерфейса является расстановка клавиатурных сокращений для выбора пунктов меню с использованием комбинаций клавиш Alt+буква (при этом буква в пункте меню подчеркивается. В зависимости от настроек операционной системы, подчеркивания могут появляться только после нажатия клавиши Alt). Не надо путать такие клавиатурные сокращения с горячими клавишами, которые приводятся справа от пунктов меню. На следующих скриншотах показаны такие подчеркнутые пункты меню, чтобы было понятно, что имеется в виду.
Чтобы добавить такое клавиатурное сокращение к пункту меню, нужно перед подчеркиваемой буквой добавить знак &. Главная проблема при этом - обеспечить уникальность подчеркнутой буквы для данного меню (к счастью, не для всего меню в целом, а только для текущего уровня вложения). Поэтому расстановка таких клавиатурных сокращений - дело муторное, легко не заметить и назначить разным пунктам меню одинаковые клавиатурные сокращения, в этом случае один из этих пунктов меню не удастся вызвать с помощью комбинаций Alt+буква. Проблема усугубляется, если у вас приложение многоязычное, тогда придется расставлять клавиатурные сокращения индивидуально для каждого поддерживаемого языка.
Использование класса Shortcuter
Класс Shortcuter предназначен для автоматизации расстановки уникальных клавиатурных сокращений. Также с помощью него можно проверить, нет ли повторяющихся клавиатурных сокращений или горячих клавиш в меню. Shortcuter работает с меню, созданным с помощью библиотеки wxPython.
На следующей UML-диаграмме показаны публичные методы класса Shortcuter.
Конструктор класса Shortcuter в качестве единственного параметра принимает экземпляр класса wx.MenuBar.
Метод assignShortcuts предназначен для автоматической расстановки клавиатурных сокращений во всем меню. При этом, если в каких-то пунктах меню клавиатурные сокращения были расставлены вручную, эти пункты меню не изменяются.
Метод checkDuplicateShortcuts предназначен для проверки конфликтов в клавиатурных сокращениях. Этот метод возвращает список заголовков пунктов меню, в которых содержатся повторные клавиатурные сокращения.
Метод checkDuplacateHotKeys предназначен для проверки повторов назначенных горячих клавиш во всем меню. Этот метод также возвращает список заголовков пунктов меню, в которых содержатся повторные горячие клавиши.
Примеры использования
В архиве с исходниками кроме непосредственно класса Shortcuter (файл shortcuter.py) лежат примеры его использования (файлы runexample.py и mainwindow.py). Файл runexample.py предназначен для запуска примера, а в файле mainwindow.py содержится класс главного окна (MainWindow). Внешний вид главного окна показан на следующем скриншоте:
В данном примере клавиатурные сокращения частично были установлены вручную (см. метод MainWindow._createMenu), а там, где клавиатурные сокращения установлены не были, они устанавливаются автоматически с помощью класса Shortcuter. Некоторые клавиатурные сокращения, установленные вручную, намеренно сделаны конфликтующими между собой для демонстрации обнаружения таких конфликтов.
Автоматическая расстановка клавиатурных сокращений
Теперь мы подошли к самому главному - как использовать класс Shortcuter. А использовать его очень просто, буквально в одну строчку.
# Импортируем класс Shortcuter
from shortcuter import Shortcuter
class MainWindow (wx.Frame):
"""Главное окно программы"""
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
super (MainWindow, self).__init__(*args, **kwds)
# Создаем класс главного окна
self.menubar = wx.MenuBar()
# Здесь создаем пункты главного меню
# ...
# Установим в окне программы главное меню
self.SetMenuBar (self.menubar)
# !!! Добавление шорткатов, которые не были расставлены вручную
Shortcuter (self.menubar).assignShortcuts()
Все! Класс Shortcuter рекурсивно просмотрит меню и все его подменю, после чего клавиатурные сокращения будут расставлены автоматически.
Поиск конфликтов клавиатурных сокращений и горячих клавиш
В главном окне примера есть две кнопки: "Проверить дубликаты шорткатов" (этих самых подчеркнутых букв) и "Проверить дубликаты горячих клавиш".
Обработчик события для кнопки "Проверить дубликаты шорткатов" выглядит следующим образом (используется метод Shortcuter.checkDuplicateShortcuts):
# Импортируем класс Shortcuter
from shortcuter import Shortcuter
class MainWindow (wx.Frame):
"""Главное окно программы"""
def __init__(self, *args, **kwds):
...
def _onCheckDuplicateShortcuts (self, event):
# Получаем список заговков пунктов меню с конфликтами шорткатов
duplicates = Shortcuter (self.menubar).checkDuplicateShortcuts()
if len (duplicates) == 0:
message = u"Повторяющихся шорткатов не обнаружено"
else:
message = u"Список повторяющихся шорткатов:\n\t" + u"\n\t".join (duplicates)
wx.MessageBox (message)
В результате нажатия на эту кнопку мы получим следующее сообщение:
Аналогично используется метод Shortcuter.checkDuplacateHotKeys, предназначенный для проверки конфликтов среди горячих клавиш.
# Импортируем класс Shortcuter
from shortcuter import Shortcuter
class MainWindow (wx.Frame):
"""Главное окно программы"""
def __init__(self, *args, **kwds):
...
def _onCheckDuplicateHotKeys (self, event):
# Получаем список заговков пунктов меню с конфликтами горячих клавиш
duplicates = Shortcuter (self.menubar).checkDuplacateHotKeys()
if len (duplicates) == 0:
message = u"Повторяющихся горячих клавиш не обнаружено"
else:
message = u"Список повторяющихся горячих клавиш:\n\t" + u"\n\t".join (duplicates)
wx.MessageBox (message)
В результате нажатия на кнопку "Проверить дубликаты горячих клавиш" появится следующее окно:
Где скачать исходники
Исходники класса Shortcuter и пример его использования лежат на github по адресу https://github.com/Jenyay/shortcuter.
Чтобы скачать их, можете воспользоваться git:
Или скачать архив с исходниками.
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.