Всем привет.

Хотя многие приложения все больше переходят в разряд WEB, я хочу в данной статье поднять тему о прикладном ПО.

А точнее о замечательной библиотеке GUI wxpython, которая является оберткой над WX Widgets.

Она очень удобна, проста в освоении, имеет множество компонентов для построения графических интерфейсов любой сложности.

А самое главное — она самая доступная в плане accessibility.

И хотя большинство компонентов доступны сразу из коробки, все равно есть некоторые с плохой доступностью.

Но не так давно появился новый инструмент, который должен помочь разработчикам еще улучшить доступность как новых, так и уже созданных раннее компонентов.

wx.Accessible


На самом деле, он появился раньше, еще в версии 4.0.4. Однако в данной версии разработчики wxpython сломали базовую доступность, что явилось большим регрессом назад в accessibility.

Про эту проблему можно посмотреть, например, здесь: wx.Accessible: generic labels seen by screen readers if the control elects not to implement IAccessible objects or name keyword for wx.Control constructor is not given.

Но в последнем большом обновлении 4.1.0 они исправили данную проблему, и теперь можно в полной мере посмотреть на новый инструмент.

С его помощью можно как сделать доступными раннее недоступные компоненты, так и расширить возможности существующих и вполне доступных компонентов. Так я и попал на него, когда искал возможность вывода для программ чтения экрана расширенной текстовой информации, не изменяя графического представления.

Так как тема доступности не самая актуальная, да и компонент этот относительно новый, никаких вразумительных примеров работы с ним я не нашел даже в англоязычном сегменте интернета, а в русскоязычном тем более никакой информации.

Попробую сделать свой небольшой вклад в эту область.

Рассмотрим пример работы с ним для наглядности.

Не буду приводить лишний стандартный код по созданию окна wx.Frame. Этих примеров полно на любой вкус. Поэтому кратко буду приводить только нововведения по работе с wx.Accessible.
Для нашего примера возьмем виджет adv.CalendarCtrl.

При захвате фокуса в данном виджете можно перемещаться по датам стрелками на клавиатуре, но при этом оно никак не озвучивается, и пользователь не может понять на какой дате он находиться в данный момент.

Кроме этого, у виджета есть и другие проблемы, например, невозможность с помощью клавиатуры сменить фокус с него и перейти к следующему компоненту интерфейса (p.s.: если кто знает вариант возвращения фокуса от подобных виджетов обратно окну — напишите в комментариях), но сейчас задача не сделать виджет календаря полностью доступным, а показать работу с wx.Accessible.

Итак у нас в программе есть инициализация данного виджета:

self.date = wx.adv.CalendarCtrl(self.panel, wx.ID_ANY,
    wx.DateTime.Today(),
    style=wx.adv.CAL_MONDAY_FIRST |
          wx.adv.CAL_SEQUENTIAL_MONTH_SELECTION)

Ниже нужно добавить следующее:

self.date.SetAccessible(AdvCalendarAccessible(self.date))

Класс AdvCalendarAccessible — это полностью наш новый класс, унаследованный от wx.Accessible, представлен ниже.

В нем и переопределяются необходимые методы для программ чтения экрана.
Итак, создадим наш новый класс:

class AdvCalendarAccessible(wx.Accessible):

    def __init__(self, window):
        self.window = window
        super().__init__(window)

    def GetName(self, index):
        date = self.window.GetDate()
        return (wx.ACC_OK, date.Format('%d.%m.%Y'))

    def GetDescription(self, index):
        text = ''
        date = self.window.GetDate()
        attr = self.window.GetAttr(date.day)
        if attr is not None:
            text = attr.GetBackgroundColour().GetAsString()
        return (wx.ACC_OK, text)

В данном варианте мы по запросу программ чтения экрана возвращаем им дату и дополнительно цвет фона выбранной даты, если она конечно отмечена программой.



Ну вот и все. Теперь пользователи могут слышать все даты при навигации клавиатурными стрелками по данному виджету.

Кроме этих методов, есть также и другие. Например, для озвучивания значения компонента или его строковой подсказки.

С полной документацией можно ознакомиться по ссылке: wx.Accessible.

Надеюсь кому-то окажется информация полезной, и ваши программы станут еще на шаг доступнее.