Shortcuter. Класс для расстановки клавиатурных сокращений в меню wxPython | jenyay.net

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. А использовать его очень просто, буквально в одну строчку.

import wx

# Импортируем класс 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):

import wx

# Импортируем класс 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, предназначенный для проверки конфликтов среди горячих клавиш.

import wx

# Импортируем класс 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:

git clone https://github.com/Jenyay/shortcuter.git

Или скачать архив с исходниками.

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
3 stars

Рейтинг 3.0/5. Всего 2 голос(а, ов)




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 715