Расширяем возможности Jaws с помощью python

(Описание способов взаимодействия между скриптами jaws и com объектами в скриптах python)
Дата публикации:2010
Поделиться в Twitter Поделиться в F******k Поделиться в VKontakte Поделиться в Telegram Поделиться в Mastodon

Резюме

Jaws обладает очень мощным языком скриптов, позволяющим Приспособить любое приложение windows для работы с программой экранного доступа. Хотя этот язык включает в себя целый ряд функций, обеспечивающих возможность легко отслеживать особенности интерфейса приложений и предоставлять речевой вывод, ему всё-же недостаёт целого ряда преимуществ, которыми обладают полноценные языки программирования, таких как возможность поддержки объектно-ориентированного программирования и возможности использования различных стандартных библиотек. К счастью, jaws обладает возможностью взаимодействия с com-объектами, что позволяет разработчикам расширять скрипты jaws с помощью компонентов из других языков программирования.

В этом кратком руководстве я опишу, каким образом язык скриптов jaws может быть расширен при помощи очень простых com-объектов, созданных с использованием языка программирования python. Я предполагаю, что читатель уже обладает некоторым опытом по созданию скриптов для jaws, а так же по программированию на современных объектно-ориентированных языках, таких как python, c++, java и так далее.От читателя не требуется понимания того, как работают com-объекты, хотя некоторый предварительный опыт может пролить свет на целый ряд деталей, которые я здесь опускаю.

Предпосылки

Для создания com-объектов с помощью python, вам потребуется скачать и установить следующие библиотеки. Ниже приводятся прямые ссылки на загрузку твующих файлов.

  1. python версии 2.3.
  2. Все расширения python для win32, созданные Марком Хаммондом.

Кроме того, у вас должен быть установлен jaws версии 4.51 или выше и какой-нибудь текстовый редактор. У вас также должен быть установлен internet explorer версии 5.0 или выше, хотя это требование относится лишь к работе с данным руководством, а не к созданию расширений для jaws в целом.

Задача: создание таймера для internet explorer

В данном руководстве мы создадим com-объект, с помощью которого пользователь получит возможность отслеживать, сколько времени он затратил на просмотр текущей web-страницы. При нажатии определённого сочетания клавиш, jaws сообщает, сколько времени прошло с момента загрузки пользователем данной страницы. Это далеко не самое полезное расширение для jaws, но его довольно просто написать и оно является хорошим учебным примером.

Создание класса timer в python

Мы начнём с создания com-объекта в python, который назовём timer.

  1. Создайте новый файл в вашем текстовом редакторе.
  2. Сохраните этот файл в какой-нибудь папке под именем jawstimer.py.
  3. Вставьте в пустой файл приведённый ниже код.
import datetime
class JAWSTimer:
 # Это уникальный глобальный идентификатор для данного com-класса.
 _reg_clsid_ = '{6CB6257E-CCEF-4AA4-B82D-ACC5CC433F80}'
 # Это имя этого же класса, но уже предназначенное читающему код человеку.
 _reg_progid_ = 'UNC.Assist.Tutorial.JAWSTimer'
 # Это методы, которые вызываются из jaws
 _public_methods_ = ['StartTimer', 'ReportTime']
 def __init__(self):
 # constructor; Данная функция вызывается при создании com-объекта
 self.timer = datetime.datetime.now()
 def StartTimer(self):
 # записать время старта для данного таймера
 self.timer = datetime.datetime.now()
 def ReportTime(self):
 # Высчитать разницу во времени
 td = datetime.datetime.now() - self.timer
 # Разница во времени выдаётся в секундах, днях и микросекундах
 # Высчитывается разница в секундах
 seconds = td.seconds + td.days*24*60*60
 # Возвращаем jaws строку для проговаривания
 return 'Данная страница загружена в течение ' + str(seconds) + ' секунд.'
if __name__ == '__main__':
 # Этот код будет выполнен, только если данный файл будет запущен прямо из python
 # Этот код регистрирует com объект в реестре windows
 import win32com.server.register
 win32com.server.register.UseCommandLine(JAWSTimer)

Некоторые пояснения по порядку. Большинство пояснений к коду содержится во вложенных комментариях, то есть, в строках, начинающихся символом решётка, ещё известным как диез. Значение _reg_clsid_ является уникальным идентификатором, который я сгенерировал с помощью отдельной утилиты. Для данного проекта вы можете использовать этот идентификатор, но вы должны генерировать новый для каждого уникального com-класса, который вы создаёте. (Об этом мы поговорим чуть позже). Значение переменной _reg_progid_ будет использоваться в jaws для создания этого com-объекта. Вы можете определить для неё любое значение, не зарезервированное для другого com-класса. Метод __init__ является стандартным конструктором для создания классов в python, в то время как StartTimer и ReportTime - это два метода, которые мы будем вызывать из нашего jaws-скрипта. И, наконец, последняя секция, в самом конце, регистрирует данный класс на локальной машине для его последующего использования.

Мы уже должны зарегистрировать данный com-класс на нашей локальной машине. Это можно сделать одним из следующих способов:

Регистрация com-класса: метод 1

  1. Откройте командную строку и перейдите в папку, в которую вы сохранили ваш файл JAWSTimer.py.
  2. Выполните в python ваш скрипт, например такой командой: c:\python23\python.exe JAWSTimer.py. Путь к исполняемому файлу python на вашей машине может отличаться, в зависимости от того, в какую папку вы его установили.
  3. Если всё прошло гладко, то появится сообщение о том, что ваш класс зарегистрирован. В противном случае будет выдано сообщение указывающее на ошибку в вашем коде, которую вам надлежит исправить.

Регистрация com-класса: метод 2

  1. Дважды щёлкните по файлу JAWSTimer.py.
  2. Если в вашем коде нет ошибок, то ваш класс будет зарегистрирован. Используя данный метод вы не сможете увидеть сообщение об успешной регистрации, поскольку окно с результатами команды исчезает слишком быстро.

После того, как вы зарегистрировали ваш com-класс, вы не можете переместить ваш файл JAWSTimer.py без необходимости заново его зарегистрировать.

Модификация скрипта jaws для internet explorer

От составителя: Ниже приведена довольно-таки нестандартная (и нерекомендуемая разработчиками JAWS) процедура создания скрипта. Если вы используете Менеджер скриптов (Диспетчер скриптов), то документировать скрипт и назначить ему комбинацию клавиш можно в диалоге создания нового скрипта, что позволяет избежать некоторых ошибок.

Теперь, после того, как мы зарегистрировали наш com-объект, мы можем использовать его в наших скриптах для jaws. Мы хотим узнать, сколько времени мы затрачиваем на просмотр страницы в internet explorer, поэтому нам понадобится отредактировать исходный файл jaws-скрипта для internet explorer. В jaws, версии 4.51, этот скрипт называется browseui.jss, а в jaws, версии 5.0, он называется Internet Explorer 5-6.jss. Для обеих версий эти скрипты находятся в поддиректории SETTINGS/enu той папки, в которую у вас установлен jaws.

  1. Откройте исходный файл скрипта для internet explorer в текстовом редакторе или в менеджере скриптов jaws.
  2. Где-нибудь, в начале файла, задайте глобальную переменную, которая будет содержать наш com-объект. Это можно сделать, например, так:
  3. globals object pyTimer
  4. Найдите функцию AutoStartEvent. В конце этой функции добавьте следующий код, который будет создавать com-объект при первом запуске браузера:
  5. If ! pyTimer Then
     Let pyTimer = CreateObject("UNC.Assist.Tutorial.JAWSTimer")
    EndIf
  6. Найдите функцию DocumentLoadedEvent. В конце этой функции, но до последнего вызова DocumentLoadedEvent, добавьте следующий код, который будет запускать таймер при загрузке нового документа:
  7. pyTimer.StartTime()
  8. Добавьте новый скрипт к файлу с именем SpeakTime, содержащий приведённый ниже код. Этот скрипт будет получать время из нашего com-объекта и сообщать его пользователю. Позднее мы назначим для этого скрипта сочетание клавиш.
  9. Script SpeakTime()
     SayString(pyTimer.ReportTime())
    EndScript
  10. Наконец, нам нужно перекомпилировать скрипт. Если вы используете менеджер скриптов, то нажмите Control-S, чтобы сохранить и перекомпилировать скрипт. Если вы не используете менеджер скриптов, то откройте командную строку, перейдите в поддиректорию SETTINGS/enu папки, в которую у вас установлен jaws и введите следующую команду, указав в двойных кавычках, вместо your_script_name, имя вашего скрипта:
  11. ../../scompile.exe your_script_name

Модификация документации к скрипту jaws для internet explorer

Теперь нам необходимо задокументировать наш новый скрипт, чтобы мы могли назначить для него сочетание клавиш. Для jaws, версии 4.51, файл документации для internet explorer называется browseui.jsd, а для версии 5.0 - Internet Explorer 5-6.jsd.

  1. Откройте соответствующий вашей версии файл документации в текстовом редакторе или в менеджере скриптов jaws.
  2. Добавьте в начало файла следующие строки:
  3. :Script SpeakTime
    :Synopsis Speak the time elapsed since the current page was loaded
    :Description Speak the time elapsed since the current page was loaded
    

Настройка горячих клавиш jaws

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

  1. В главном окне jaws выберите в меню утилиты менеджер клавиатуры.
  2. В левой ниспадающей панели выберите имя вашего скрипта для internet explorer. Ещё раз, этот скрипт называется Internet Explorer 5-6 для jaws, версии 5.0 и browseui для jaws 4.51.
  3. В правой панели выберите пункт SpeakTime.
  4. Нажмите Control-A, чтобы назначить для этого скрипта новое сочетание клавиш.
  5. Нажмите Control-Shift-T, чтобы назначить нашему скрипту это сочетание.

Проверка скрипта

Теперь вы можете запустить internet explorer, чтобы протестировать наш com-объект и наш новый скрипт. Когда вы нажимаете Control-Shift-T, jaws должен сообщать нам, сколько времени прошло с момента открытия в браузере web-страницы.

Следующий шаг

Вот и всё на этом. Вы прочитали данное руководство и создали ваш первый com-объект для jaws. Теперь вы можете воспользоваться шагами, описанными в этом руководстве, для создания ваших собственных полезных расширений к jaws. Однако, создавая свои собственные com-объекты, вы должны кое-что иметь ввиду:

  • Вам необходимо генерировать новый идентификационный номер для каждого создаваемого вами нового com-объекта. Для того, чтобы сгенерировать уникальный идентификатор, запустите из командной строки интерактивную оболочку python и в ней введите: import pythoncom и нажмите ввод. Затем введите: print pythoncom.CreateGuid(). На следующей строке появится новый уникальный идентификатор, который вы сможете использовать в качестве значения для переменной _reg_clsid_ вашего нового com-класса.
  • Ваш com-объект должен иметь уникальное, читаемое человеком имя. Не забывайте задавать уникальное значение переменной _reg_progid_ в вашем com-классе
  • Вы можете использовать ваши com-объекты в любых скриптах jaws, а не только в скриптах для internet explorer. Не ограничивайтесь созданием расширений только для работы с web.

Полезные ссылки

Чтобы узнать больше о jaws, python и о разработках для людей с ограниченными возможностями, вы можете посетить следующие сайты:

  1. Manual(самораспаковывающийся архив с документацией)
  2. ?php print_url("Freedom Scientific Developers Network Manual", "http://www.freedomscientific.com/fs_support/documentation/ScriptFunction/FSDN.exe")?>(самораспаковывающийся архив с документацией)
  3. Все, что вы хотели знать о написании скриптов...
  4. Справочник разработчика скриптов
  5. Dive Into Accessibility Tutorial
  6. Dive Into Python Tutorial
  7. Python Official Homepage


Распространение материалов сайта означает, что распространитель принял условия лицензионного соглашения.
Идея и реализация: © Владимир Довыденков и Анатолий Камынин,  2004-2024