Всем привет.
Хотя многие приложения все больше переходят в разряд WEB, я хочу в данной статье поднять тему о прикладном ПО.
А точнее о замечательной библиотеке GUI wxpython, которая является оберткой над WX Widgets.
Она очень удобна, проста в освоении, имеет множество компонентов для построения графических интерфейсов любой сложности.
А самое главное — она самая доступная в плане accessibility.
И хотя большинство компонентов доступны сразу из коробки, все равно есть некоторые с плохой доступностью.
Но не так давно появился новый инструмент, который должен помочь разработчикам еще улучшить доступность как новых, так и уже созданных раннее компонентов.
На самом деле, он появился раньше, еще в версии 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.
Итак у нас в программе есть инициализация данного виджета:
Ниже нужно добавить следующее:
Класс AdvCalendarAccessible — это полностью наш новый класс, унаследованный от wx.Accessible, представлен ниже.
В нем и переопределяются необходимые методы для программ чтения экрана.
Итак, создадим наш новый класс:
В данном варианте мы по запросу программ чтения экрана возвращаем им дату и дополнительно цвет фона выбранной даты, если она конечно отмечена программой.
Ну вот и все. Теперь пользователи могут слышать все даты при навигации клавиатурными стрелками по данному виджету.
Кроме этих методов, есть также и другие. Например, для озвучивания значения компонента или его строковой подсказки.
С полной документацией можно ознакомиться по ссылке: wx.Accessible.
Надеюсь кому-то окажется информация полезной, и ваши программы станут еще на шаг доступнее.
Хотя многие приложения все больше переходят в разряд 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.
Надеюсь кому-то окажется информация полезной, и ваши программы станут еще на шаг доступнее.